無意中發現的這個有趣的問題。
觀察下列**, 父類和子類中都定義有 string name變數,那最終繼承之後是不是只剩下1個name?還是父類子類的name互相不相干?
通過賦值後,最後會輸出什麼?見如下
public class son extends parent
public static void main (string args)
}//end class
class parent
}//end class
輸出:a
b由此可見,子類首先 name=「a」,即使呼叫了父類value()中的 name ="b",
system.out.println(name); 仍然是輸出 a ,可見子類通過引用父類方法並不改變子類中的name的值,即使賦值的變數名都是name
然而,改變的是父類中自己的name變數,因此system.out.println(super.name);輸出 b
綜合得知,父類與子類定義同名的變數,並不會覆蓋,而是各自還有自己的空間,即使變數名相同
子類中呼叫父類的對同名變數name賦值的方法,仍然只是改變父類自己的name變數的值
再看乙個,結合父類引用,多型問題
public class son_test extends parent
}class parent
}
輸出:
son.i=10
son.i=10
100由此可見,當父類子類存在同名變數時,引用型別是父類,即使是子類的物件,son.i 中的 i 卻是 父類中的 i 。
分界線我們知道,如 parent a = new son(); 其中son的父類是parent, 利用引用 a.變數 或者 a.方法時候,即使son類中有對應的變數或方法,而父類parent 中沒有a.變數 或者 a.方法,是不能通過編譯的,
但若父類parent 中存在對應的 變數和方法 ,son子類中也有同名的變數和方法, 則a.方法 呼叫的是子類的方法,而 a.變數 呼叫的確是 父類的變數。
見如下**
public class a
void go2()
//內部類
class animal
}class dog extends animal
}
輸出:
dogs are eating ( animal.eat() 呼叫的是子類的 eat() )
10( animal.i 呼叫的是父類的 i )
子類繼承父類的成員變數
1 子類可以繼承父類的成員變數 只能繼承public 和protected,不能private 2 子類拿到的父類的成員變數值是初始化的值。3 如下面classb繼承classa,只能拿到初始化的a的值。int classa a 0 int main class classa include std...
Java 子類繼承父類呼叫順序
建立子類後的呼叫順序 構造器呼叫順序 多型this.method o super.method o this.method super o super.method super o 注意 如果某個方法是靜態的,那麼這個方法就不具有多型性。class a a public void fun publi...
C 繼承時子類父類同名成員變數的問題
如下 c c code include iostream.h class base intprint base class public base print main 輸出結果是0,1。而不是1,1。為什麼不同呢?解釋 因為在繼承的時候,允許子類存在與父類同名的成員變數,但是並不覆蓋父類的成員變數...