父類的屬性或者方法被private修飾過以後,子類是否能繼承的問題,以及this和super的區別

首先,繼承的定義:繼承是指一個對象直接使用另外一對象的屬性和方法測試

很明顯,父對象被private修飾過的屬性和方法,子對象沒法直接使用(能夠經過父類的get 、set方法間接使用this

那麼根據繼承的定義來判斷:private修飾過的都沒法被繼承spa

得出結論以後,我本身寫了一些代碼進行測試。code

  1.  使用繼承後,父對象會隨着子對象的建立而建立,根據內存加載的順序也能夠看出來。對象

  2.  父對象會比子對象早一步先建立:緣由blog

      2.1  子類的構造方法第一句老是要寫上父類的構造方法,用來建立父對象,由於繼承是發生在對象與對象之間的,因此必須先有一個父對象,子對象再去繼承父對象繼承

  3.  隨着子對象的建立完畢,內存也同時存在父對象,這個父對象只能被子對象使用,子對象經過 super 關鍵字調用父對象的屬性和方法內存

  4.  若是沒有重寫屬性和方法,那麼子對象裏面實際上並無一個真正屬於 "本身" 的屬性和方法,因此此時咱們不管用 this 或者 super ,調用的都是父對象的東西,也就是說關鍵詞寫不寫都無所謂,反正引用的都是同一個內存地址get

  5.  發生重寫後,子對象從實際上擁有了屬於 "本身" 的屬性和方法,因此這時候咱們必須使用 thissuper 關鍵字來區分到底使用誰的數據io

 

public class Test01 {
    public static void main(String[] args) throws CloneNotSupportedException {
        //建立子對象
        B b = new B();    
        
        //調用子對象的t1方法
        b.t1();

    }
}

//父類
class A {
    private int test = 7;
    
    String name;
    int age;

    A(String name) {
        this.name = name;
    }
}

//子類
class B extends A {
    int test = 8;
    
    //重寫age後,子對象擁有屬於本身的age
    int age;

    B() {
        
        // 建立父類對象,父對象初始化 name = "小明"
        super("小明"); 
    }

    void t1() {
        
        // 小明
        System.out.println(super.name); 
        
        // 小明   從這裏能夠看出繼承是先有父對象,子對象使用或繼承(複製)父對象的name,
        //      可是咱們還不能判斷子對象是複製仍是直接調用父對象的name。
        System.out.println(this.name);     
                                        
        this.name = "小紅";
        
         // 小紅 這裏表示,this.name和super.name是同一個變量,也就是說繼承以後,父對象的屬性和對象能夠被子對象調用
        System.out.println(super.name);
        
        super.age = 1;
        this.age = 2;
        
        //    1    父對象age並無被修改
        System.out.println(super.age);
        
        //    2    這裏顯示的是子對象本身的age
        System.out.println(this.age);
        
        //super.test報錯(被private保護了)
        //System.out.println(super.test);
        
        //this.test可用
        System.out.println(this.test);
    }

}
相關文章
相關標籤/搜索