今天遇到這樣一道選擇題:
以下程序運行結果是()
public class Child extends Father {
public String name = "child";
public static void main(String[] args) {
Child c = new Child();
System.out.println(c.getName());
}
}
class Father {
public String name = "father";
public String getName() {
return name;
}
}
A: father B:child C:編譯出錯 D:運行出錯,無輸出
編譯結果是:father
Java編程思想講繼承語法時說,子類繼承父類,會自動得到父類中所有的域和方法。
不知道是不是中文版翻譯跟原意有區別,我的理解是子類繼承父類,子類可以訪問父類的屬性和方法(同時受到訪問權限的限制),而不是得到。
可分爲以下四種情況討論:
1、子類沒有重寫父類的方法,調用父類的方法訪問一個屬性,訪問的是父類的屬性,因爲調用的是父類的方法。
public class Child extends Father {
public String name = "child";
public static void main(String[] args) {
Child c = new Child();
System.out.println(c.getName());
}
}
class Father {
public String name = "father";
public String getName() {
return name;
}
}
輸出:father
2、子類重寫父類的方法,調用此方法訪問一個屬性,訪問的是子類的屬性,因爲此時調用的方法是子類的方法,只有當子類不存在此方法時,纔會去父類中尋找
public class Child extends Father {
public String name = "child";
public String getName() {
return name;
}
public static void main(String[] args) {
Child c = new Child();
System.out.println(c.getName());
}
}
class Father {
public String name = "father";
public String getName() {
return name;
}
}
輸出:child
3、父子類中有相同的屬性,若要調用父類的屬性,則需要使用super.屬性 來調用父類中的屬性
public class Child extends Father {
public String name = "child";
public String getName() {
return super.name;
}
public static void main(String[] args) {
Child c = new Child();
System.out.println(c.getName());
}
}
class Father {
public String name = "father";
public String getName() {
return name;
}
}
輸出:father
4、若子類沒有該屬性,則在子類中調用重寫的方法訪問屬性,調用的是父類屬性,不需顯示使用 super.屬性 來調用
public class Child extends Father {
//public String name = "child";
public String getName() {
return name;
}
public static void main(String[] args) {
Child c = new Child();
System.out.println(c.getName());
}
}
class Father {
public String name = "father";
public String getName() {
return name;
}
}
輸出:father