java 多態陷阱

來源:互聯網
上載者:User

照原來,先考考大家,在不啟動並執行情況下說出下面程式的輸出結果(請先注意這是關於多態的啊)

package acm;//例一class Test extends Main {private void write() {System.out.println("Test");}}public class Main {private void write() {System.out.println("Main");}public static void main(String[] args) {Main main = new Test();main.write();}}//我們所期望的是 輸出Test,但由於private方法被自動認為是final方法。而且對匯出的類是屏蔽的。因此//在這種情況下,Test下的write就是一個全新的方法,Main中的方法在子類中方法不可見,因此也不能被重載//只有非private 方法才可以被覆蓋 。因此結果是:Main//例二class Super {public int field = 0;public int getField() {return field;}}class Sub extends Super {public int field = 1;public int getField() {return field;}public int getSuperField() {return super.field;}}public class Main {public static void main(String[] args) {Super sup = new Sub();System.out.println("sup.field= " + sup.field + ",sup.getField()="+ sup.getField());Sub sub = new Sub();System.out.println("sub.field= " + sub.field + ",sub.getField()="+ sub.getField() + ",sub.getSuperField()="+ sub.getSuperField());}}//當Sub對象轉型為Super引用時,任何域訪問操作都將由編譯器解析,因此不是多態的。//在本例中,為Super.field和Sub.field分配了不同的儲存空間。這樣,Sub實際上包含兩個稱為field的域://它自己的和它從Super處得到的。結果://sup.field= 0,sup.getField()=1//sub.field= 1,sub.getField()=1,sub.getSuperField()=0//例三class Glyph {void draw() {System.out.println("Glyph.draw()");}Glyph() {System.out.println("Glyph() before draw()");draw();System.out.println("Glyph() after draw()");}}class RoundGlyph extends Glyph {private int radius = 1;RoundGlyph(int r) {radius = r;System.out.println("RoundGlyph.RoundGlyph(),radius=" + radius);}void draw() {System.out.println("RoundGlyph.draw(),radius=" + radius);}}public class Main {public static void main(String[] args) {new RoundGlyph(5);}}//當Glyph 的構建器調用draw()時,radius 的值甚至不是預設的初始值1,而是 0。//上一篇文章的所述初始化順序是不全面的,實際過程是這樣的: //(1) 在採取其他任何操作之前,為對象分配的儲存空間初始化成二進位零。 //(2) 調用基礎類構建器。此時,被覆蓋的draw()方法會得到調用(的確是在RoundGlyph構建器調用之前),//此時會發現radius的值為 0,這是由於步驟(1)造成的。 //(3) 按照原先聲明的順序調用成員初始化代碼。 //(4) 調用衍生類構建器的主體。 //結果://Glyph() before draw()// RoundGlyph.draw(),radius=0// Glyph() after draw()// RoundGlyph.RoundGlyph(),radius=5

以上均由近期讀Thinking in Java所得

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.