[英]Java Inheritance classes with main method
我定義了2個對象
在對象1中,當我引用子對象時,它將調用子方法m1();而在對象2中,當我引用子方法m1()時,它將引用父對象。
在這兩種情況下,我都假定父對象將在運行時保存子類型對象...
對象1
package pkgB;
class Parent{
static int i = 10;
void m1(){
System.out.println("In Parent = " + i);
}
static void m1(String s){
System.out.println(s +i );
}
}
public class Child extends Parent{
static int i = 20;
void m1(){
System.out.println("In child" + Child.i);
}
public static void main(String[] args){
Parent p = new Child();
p.m1();
}
}
對象2
package pkgB;
class Drink{
public static void m1(){
System.out.println("Im Drink method");
}
}
class Coffee extends Drink{
public static void m1(){
System.out.println("Im Coffee method");
}
}
public class test {
public static void main(String[] args) {
Drink d = new Coffee();
d.m1();
}
}
輸出Dobject-1:
In child20
輸出Dobject-2:
Im Drink method
靜態方法按其類型調用,而實例方法則根據對象類型進行調用。 靜態方法不會被覆蓋 。
當你說,
Parent p = new Child();
p.m1();
您正在創建Parent
對象的引用類型,但創建Child
對象的對象類型。 m1()
是實例方法,因此它被覆蓋,並且調用Child
方法,因為對象的類型為Child
但是當你說
Drink d = new Coffee();
d.m1();
在這里, m1()
是綁定到類類型的static
方法。 所以d.m1()
將調用static
方法,因為d
是Drink
類型
在第二個示例中, m1()
方法是靜態方法。 執行d.m1()
,編譯器應向您發出警告,這與以非靜態方式引用靜態方法有關。
無論如何,當你調用d.m1()
在第二個例子中,你真的叫Drink.m1()
因為d
被宣布為Drink
。
使用引用變量調用靜態方法意味着您處於Sin狀態:)
靜態方法/變量僅是類的一部分,不能被覆蓋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.