public abstract class A {
int i=1;
public void printI() {
System.out.println("i="+i);
}
}
public class B extends A{
int i=2;
public static void main(String[] args) {
B b=new B();
b.printI();
}
}
那麼,控制台打出來的i的值是多少?
呵呵,如果一下功夫就能說出正确結果1,那麼,下面部分就不需要往下看了。
1、類的繼承知識點
(1)java不支援多重繼承,也就是說子類至多隻能有一個父類
(2)子類繼承了其父類中不是私有的成員變量和成員方法,作為自己的成員變量和方法
(3)子類中定義的成員變量和父類中定義的成員變量相同時,則父類中的成員變量不能被繼承
(4)子類中定義的成員方法,并且這個成員方法的名字,傳回類型,及參數個數和類型與父類的某個成員方法完全相同,則父類的成員方法不能被繼承。
2、答案是2者如是說
子類B中的變量i和父類A中的變量i重名, 那麼子類B中的變量i将會覆寫掉父類中的同名變量i. 則通路父類中的變量時jvm會把子類cast到父類.是以,列印出的結果應該是“i=2”;
3、歧義的産生
歧義的産生最關鍵的地方是子類B中的變量i将會覆寫掉父類中的同名變量i的覆寫兩個字。這裡,我覺得這兩個字容易誤導。應該改為屏蔽或隐藏。因為在這裡父類的成員變量是沒有被改變。
4、jvm的執行過程
(1)子類B 的構造方法被調用,執行個體化一個B對象,B對象的成員被初始化
(2)jvm隐含的調用父類的構造方法,執行個體化一個A對象,A對象的成員被初始化。
(3)由于A對象的printI()未被屏蔽,是以調用的A對象的printI()函數。
那麼,在這裡A的成員函數當然是通路自己的成員變量了。
5、super關鍵字
super關鍵字在java中的作用是使被屏蔽的成員變量或者成員方法或變為可見,或者說用來引用被屏蔽的成員變量和成員成員方法。super是用在子類中,目的是通路直接父類中被屏蔽的成員。上面的代碼也可以這樣寫:
Java代碼
public abstract class A {
int i=1;
public void printI() {
System.out.println("i="+i);
}
}
public class B extends A{
public int i=2;
public void printI(){
super.printI();
}
public static void main(String[] args){
B b= new B();
b.printI();
}
}
注:
JVM執行個體化程式的過程中,若對子類進行執行個體化,必然要對父類的構造器進行執行個體化繼承。
C exteds D(){}
C c = new C();
構造器,采取先父後子的關系。
而方法,若調用的方法為子類所覆寫,則主動調用兒子的方法,因為此時,已經繼承了父類所擁有的
相關變量,而方法行為,子類具有相對來說的獨立性,可以獨立調用。
D c = new C();
JVM處理過程,也是如此。
先繼承D的構造器(基因),再加載C獨自的構造器,同時,對相關方法進行相應的調用。