2 回答

TA貢獻2051條經驗 獲得超10個贊
假設有一個 Animal 類:
public class Animal {
private String _name;
public Animal(String name) { _name = name;}
public String getName() {return _name;}
}
現在有一個 Dog 類:
public class Dog extends Animal {
public Dog() {
super("Dog");
}
}
現在,如果你這樣做:
Animal dog = new Dog();
System.out.println(dog.getName());
這就是您如何使變量名從Dog類到Animal.

TA貢獻1934條經驗 獲得超2個贊
Java繼承是超級內容復制?
我真的很想了解繼承是如何工作的,
假設我們有類 A 和 B,B 擴展了 A,A 包含一些在公共和方法上設置的屬性(引用類型和原始類型)
這些屬性和方法是否復制到 B 類中?
公共屬性和方法由子類繼承B??紤]類A及其子類B:
public class A {
public int aNumber = 99;
public StringBuilder aString = new StringBuilder("sb");
private String privateVar = "private stuff";
public A() {
}
public A(int i, StringBuilder s) {
aNumber = i;
aString = s;
}
public int getMyNumber() {
return aNumber*2;
}
public StringBuilder getMyString() {
return aString.append("!!");
}
@Override
public String toString() {
return aNumber + " : " + aString;
}
}
public class B extends A {
public B() {
}
public B(int i, StringBuilder s) {
super(i, s);
}
}
下面的類有一些代碼來測試上面兩個類的行為,在繼承方面:
public class TestingInheritance {
public static void main(String [] args) {
A a = new A(3, new StringBuilder("test1"));
System.out.println("A: " + a);
B b = new B();
System.out.println("b: " + b);
System.out.println("b.aNumber: " + b.aNumber);
System.out.println("b.getMyNumber: " + b.getMyNumber());
System.out.println("");
B b2 = new B(2, new StringBuilder("xx"));
System.out.println("b2: " + b2);
System.out.println("b2.aString: " + b2.aString);
System.out.println("b2.getMyString: " + b2.getMyString());
//System.out.println("Private: " + b.privateVar);
}
}
輸出:
A: 3 : test1
b: 99 : sb
b.aNumber: 99
b.getMyNumber: 198
b2: 2 : xx
b2.aString: xx
b2.getMyString: xx!!
討論:
有兩個類A和B。該類B擴展A. A是超類,B是它的子類。這兩個類各有兩個構造函數——一個是默認的無參數構造函數和一個帶參數的構造函數。
該類A具有原始類型和引用類型的公共屬性:int aNumber和java.lang.StringBuilder aString。有公共的方法getMyNumber,getMyString以及java.lang.Object類的重寫toString。注意還有一個私有變量privateVar。
代碼詳情來自TestingInheritance:
(我認為:
B b = new B();
這構造了 的一個實例B。這繼承了其超類的屬性和方法A。
System.out.println("b: " + b); // b: 99 : sb
新創建的對象b具有從其超類繼承的屬性值A;因此它從其重寫的toString方法打印屬性默認值。請注意在類中A為屬性定義的默認值是99和一個StringBuilder帶有字符串值“sb”的對象。
下面A使用默認屬性值打印來自繼承的屬性和方法結果。
System.out.println("b.aNumber: " + b.aNumber); // 99
System.out.println("b.getMyNumber: " + b.getMyNumber()); // 198
(ii) 考慮:
B b2 = new B(2, new StringBuilder("xx"));
這將B使用提供的參數構造一個實例:2和new StringBuilder("xx")。請注意類B的構造函數中的語句super(i, s);這是必需的。而且,如果未指定,則會出現編譯時錯誤。
System.out.println("b2: " + b2); // 2 : xx
這將打印在所提供的參數值B類的構造函數,后者又傳給A類的構造函數參數:super(i, s)。當B創建類的實例(使用構造函數)時,A類的構造函數運行,首先- 查看super(...)語句(它是構造函數代碼中的第一個語句)。
下面打印繼承的屬性值和方法返回值。
System.out.println("b2.aString: " + b2.aString); // xx
System.out.println("b2.getMyString: " + b2.getMyString()); // xx!!
(iii) 最后,以下語句如果沒有注釋程序TestingInheritance將無法編譯。會出現錯誤:TestingInheritance.java:18: error: privateVar has private access in A。
System.out.println("Private: " + b.privateVar);
但是,可以B通過 class 中定義的公共方法訪問私有屬性A。
添加回答
舉報