day04

多態(tài)

8.3構造器和多態(tài)

  1. 盡管構造器并不具有多態(tài)性(它們實際上是static方法,只不過該static聲明是隱式的)
  2. 構造器調(diào)用順序:
    1. 調(diào)用基類構造器.
    2. 按聲明順序調(diào)用成員初始化方法.
    3. 調(diào)用導出類構造器主體.
  3. 上2初始化順序并不完整
    1. 在其他任何事物發(fā)生之前,將分配給對象的存儲空間初始化成二進制的零.
    2. 如前所述的那樣調(diào)用基類構造器.
    3. 按聲明順序調(diào)用成員初始化方法.
    4. 調(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
  1. 因此編寫構造器時有一條有效準則:"用盡可能簡單的方法使對象進入正常狀態(tài);如果可以的話,避免調(diào)用其他方法".
  2. 在構造器內(nèi)唯一能夠安全調(diào)用的那些方法時基類匯總的final方法(也適用private方法,它們自動屬于final方法).
  3. 用繼承表達行為間的差異,并用字段表達狀態(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抽象類和抽象方法

  1. 如果從一個抽象類繼承,并想創(chuàng)建該新類的對象,那么就必須為基類中的所有抽象方法提供定義.
  2. 這個題比較有意思我寫下來.

    創(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);
    }  
}  
  1. 續(xù)接口,接口中在jdk1.8后可以default聲明關鍵字
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 母親從小對我很嚴厲,雖說我是女孩子,但性格跟男孩子一樣野,喜歡上樹掏鳥窩,喜歡上房揭瓦、偷雞摸狗。 村里人都不待見...
    風花星月閱讀 460評論 9 9
  • 我一直都知道我們不會在一起 但是聽說你要走了 我還是好難過
    阿怡阿一吖閱讀 294評論 0 0
  • 灌叢低低矮矮, 精致小巧。 有一只蛾子, 也許是蛾子? 但體型稍大了些, 蝴蝶? 花紋卻并不艷麗。 也許是尚未被生...
    迷途的金絲雀閱讀 272評論 0 0

友情鏈接更多精彩內(nèi)容