亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java繼承是超級內容復制?

Java繼承是超級內容復制?

嚕嚕噠 2021-12-22 16:05:49
我真的很想了解繼承是如何工作的,假設我們有類 A 和 B,B 擴展了 A,A 包含一些在公共和方法上設置的屬性(引用類型和原始類型)這些屬性和方法是否復制到 B 類中?我確實讀過方法沒有被復制,而是通過引用訪問。當我們創建 B 的實例時繼承的引用類型屬性如何?他們必須在內存中占用一些空間,該引用存儲在哪里?在 A 類或 B 類?那么原始類型是否會被復制到 B 類中,并且它們是否與 B 的其他屬性位于同一位置?或者當你創建一個 B 類的對象時,你實際上創建了一個 A 和 B 的對象并且它們保持某種關系?一些解釋會有所幫助。
查看完整描述

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.


查看完整回答
反對 回復 2021-12-22
?
撒科打諢

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。


查看完整回答
反對 回復 2021-12-22
  • 2 回答
  • 0 關注
  • 226 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號