java 父類子類繼承 同名變數 同名方法

2021-07-05 02:26:10 字數 1361 閱讀 5436

無意中發現的這個有趣的問題。

觀察下列**, 父類和子類中都定義有 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。為什麼不同呢?解釋 因為在繼承的時候,允許子類存在與父類同名的成員變數,但是並不覆蓋父類的成員變數...