Java的多态形式中,如何访问成员变量和调用成员方法
父類的引用指向子類的對象:
Fu obj = new Zi(); int num = obj.num; obj.show(); obj.methodZi();1.如果父類和子類都有成員變量 num,請問上面的例子中訪問的是誰的成員變量?
答:看等號左邊是誰(變量的聲明類型),則優(yōu)先用誰的,沒有則向上。所以訪問的是父類的成員變量 num。父類的變量是不能被子類覆蓋重寫的
2.如果父類和子類都有成員方法 show(),請問上面的例子中訪問的是誰的成員方法 show()?
答:看等號右邊是誰(創(chuàng)建哪個類的實例對象,即對象實際所屬的類型),則優(yōu)先調(diào)用誰的,沒有則向上。子類有 show(),所以就是調(diào)用子類的,沒有就向上在父類中查找。父類的成員方法可以被子類覆蓋重寫
3.子類有方法 methodZi(),但是父類沒有,那么通過變量名稱調(diào)用方法 methodZi() 是否正確呢?
答:錯誤。Java 代碼在編譯的時,對于引用類型的變量,編譯時看的是聲明的類型,運行時才看對象的實際類型。變量 obj 聲明的類型是父類,父類根本沒有方法 methodZi(),所以 obj.methodZi(); 編譯會報錯。為什么 obj.show(); 不會報錯,因為父類也有 show() 方法所以編譯不會報錯,但是在運行時看的是右邊,右邊的子類也有方法 show(),所以實際調(diào)用的是子類的方法 show()
口訣:
對于成員方法:編譯看左邊,運行看右邊。
對于變量:編譯看左邊,運行也看左邊。
多態(tài)的好處:
可以創(chuàng)建各種子類對象,都不會影響父類變量的方法調(diào)用代碼,因為父類變量是根據(jù)父類所聲明的方法進行調(diào)用的。
注意下面的錯誤代碼:
FuInterface obj = new FuInterfaceImpl(); obj.staticMethod(); // 編譯直接報錯,提示:只有含有此靜態(tài)方法的接口類才能調(diào)用此靜態(tài)方法注:staticMethod() 是接口和實現(xiàn)類都有的靜態(tài)方法
但是下面的代碼沒有錯誤:
Fu obj = new Zi(); obj.staticMethod(); // 編譯通過,而且只會調(diào)用父類的靜態(tài)方法注:
1.staticMethod() 是父類和子類都有的靜態(tài)方法
2.子類不能覆蓋重寫父類的靜態(tài)方法,但是子類也可以聲明定義和父類一模一樣的靜態(tài)方法,但不屬于覆蓋重寫
總結(jié)
以上是生活随笔為你收集整理的Java的多态形式中,如何访问成员变量和调用成员方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝呗青年体验金可以用多久?
- 下一篇: 农村信用社是国企吗?