多態(tài)
8.3構造器和多態(tài)
- 盡管構造器并不具有多態(tài)性(它們實際上是static方法,只不過該static聲明是隱式的)
- 構造器調(diào)用順序:
- 調(diào)用基類構造器.
- 按聲明順序調(diào)用成員初始化方法.
- 調(diào)用導出類構造器主體.
- 上2初始化順序并不完整
- 在其他任何事物發(fā)生之前,將分配給對象的存儲空間初始化成二進制的零.
- 如前所述的那樣調(diào)用基類構造器.
- 按聲明順序調(diào)用成員初始化方法.
- 調(diào)用導出類構造器主體.
//本例中存在兩個知識點
//1. 如果要調(diào)用構造器內(nèi)部的一個動態(tài)綁定的方法,就要用到那個方法的覆蓋后的定義.
//2. 在其他任何事物發(fā)生之前,將分配給對象的存儲空間初始化成二進制的零.
//即初始化radius為0
class Glyph{
void draw(){
print("Glyph.draw()");
}
Glyph(){
print("Glyph() before draw()");
draw();
print("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph{
private int radius = 1;
RoundGlyph(int r){
radius = r;
print("RoundGlyph.draw(). radius = " + radius);
}
void draw(){
print("RoundGlyph.draw().radius" + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}/*Ouput:
Glyph() before, radius = 0
Glyph() after draw ()
RoundGlyph.RoundGlyph(), radius = 5
- 因此編寫構造器時有一條有效準則:"用盡可能簡單的方法使對象進入正常狀態(tài);如果可以的話,避免調(diào)用其他方法".
- 在構造器內(nèi)唯一能夠安全調(diào)用的那些方法時基類匯總的final方法(也適用private方法,它們自動屬于final方法).
- 用繼承表達行為間的差異,并用字段表達狀態(tài)上的變化.附代碼
class Actor{
public void act(){}
}
class HappyActor extends Actor{
public void act(){
print("HappyActor");
}
}
class SadActor extends Actor{
public void act(){
print("SadActor");
}
}
class Stage{
private Actor actor = new HappyActor();
public void change(){
actor = new SadActor();
}
public void performPlay(){
actor.act();
}
}
public class Transmogrify {
public static void main(String[] args) {
Stage stage = new Stage();
stage.performPlay();
stage.change();
stage.performPlay();
}
}
接口
9.1抽象類和抽象方法
- 如果從一個抽象類繼承,并想創(chuàng)建該新類的對象,那么就必須為基類中的所有抽象方法提供定義.
- 這個題比較有意思我寫下來.
創(chuàng)建一個不包含任何方法的抽象類,從哪里導出一個類,并添加一個方法.創(chuàng)建一個靜態(tài)方法,他可以接收指向基類的引用,將其向下轉型到導出類,然后再調(diào)用該靜態(tài)方法,在main()中,展現(xiàn)它的運行情況.然后,為基類中的方法加上abstract聲明,這樣就不再需要進行向下轉型.
abstract class Dad {}
class Son extends Dad {
protected void print() { System.out.println("Son"); }
}
abstract class SecondDad {
abstract protected void print();
}
class SecondSon extends SecondDad {
protected void print() { System.out.println("SecondSon"); }
}
public class Ja9_1_4 {
public static void testPrint(Dad d) {
((Son)d).print();//it's necessary
}
public static void secondTestPrint(SecondDad sd) {
sd.print();//don't need ((SecondSon)sd)
}
public static void main(String[] args) {
Son s = new Son();
Ja9_1_4.testPrint(s);
SecondSon ss = new SecondSon();
Ja9_1_4.secondTestPrint(ss);
}
}
- 續(xù)接口,接口中在jdk1.8后可以default聲明關鍵字