日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于java子類繼承來的屬性與方法究竟是完全復制還是共用使用

關于java子類繼承來的屬性與方法究竟是完全復制還是共用使用

今天在學習java的面向對象時,無意間發現一個問題。

public class testEquals{

public static void main(String[] args){

Child cd1 = new Child();

cd1.f();

}

}

class Father{

public int value;

public void f(){

value = 100;

System.out.println("classFatherValueIs:"+value);

}

}

class Child extends Father{

public int value; //請看這里

public void f(){

super.f();

value = 200;

System.out.println("classChildValueIs:"+value); //輸出

System.out.println(value);

System.out.println(super.value+"super.value");

}

}

/**

result:

classFatherValueIs:100

classChildValueIs:200

200

100super.value

**/

當Child類在繼承Father類時,子類有重新聲明value變量,在Child.f()內對value變量的值進行修改并不會改變父類Father.f()的值。

斷點debug:父類子類均有自己的值

而當我將子類的value變量聲明去掉后,情況變得和想象中就不太一樣了,以往我所認知的繼承應該是將非private的成員統統復制過來,并于父類互補干擾。但實際并不是這個樣子。

當去掉子類的類型聲明

package cn.sxt.oop;

public class testEquals{

public static void main(String[] args){

Child cd1 = new Child();

cd1.f();

}

}

class Father{

public int value;

public void f(){

value = 100;

System.out.println("classFatherValueIs:"+value);

}

}

class Child extends Father{

public void f(){

super.f();

value = 200;

System.out.println("classChildValueIs:"+value);

System.out.println(value);

System.out.println(super.value+"super.value");

}

}

/**

result:

classFatherValueIs:100

classChildValueIs:200

200

200super.value

父類的value值隨著子類一起改變了。雖然沒有顯示的在子類中聲明value變量,但通過繼承,應該是互不干擾才是,為什么在子類定義value,父類的值也改變了。

斷點debug:此時父類的value也受到了子類的影響變成了200

子類究竟時如何被實例化出來的?

以上面child類為例,Child的父類是Father類,而father類繼承所有類的老子Object類。也就是說實例化一個Child類,首先要生成一個Object類,father類繼承Object類中被特別定義的成員,并根據要求生成Father實例,Child類再繼承Father實例生成child對象。也就是說如果想單獨生成Child類,Father于Object類也再咱們不知情的情況下生成了。

大膽推測一下:

繼承并不是單純的復制父類代碼。在子類中沒有對父類的相同的成員名進行單獨定義時,子類繼承來的成員其實只是對父類成員的引用。當單獨去進行聲明,即使沒有重新去定義邏輯,也相當于覆蓋了繼承來的屬性或方法。

如果繼承是單純的復制代碼,那么子類所占的內存需要和父類一樣打,甚至更大。所以相同的部分向上引用應該就是一個很好的辦法。

后來在科普看到了類似的解答,和我猜的大致差不多:

繼承是復制還是共用?例如 Dog類繼承Animal類,在Dog中的屬性修改,Animal中的屬性也會一起改變嗎?如果用Dog和Animal分別實例化對象,dog和animal,這兩者的屬性是公用還是各占內存,毫無關系?另外要對子類繼承的屬性賦值,通過super(),最終跳到父類構造器,此時,是不是創建了一個父類對象?

1、共用更恰當,因為父類的一些私有方法和私有屬性是不會被繼承的,繼承之后,子類可以共用父類的公有屬性和公有方法,,

2、Dog中如果沒有重新定義父類已有的同名屬性,則修改公有屬性就是修改父類的公有屬性,即父類的屬性會一起改變,,

3、如果兩者都實例化,肯定是兩個不同的對象,內存地址不可能共用的,就算是Dog實例化多次也是只是多個不同的對象,內存地址是不一樣的,,

4、super其實就是一個區分標志,不會新建對象的,,,super()只是調用父類的無參構造方法,因為子類也有無參構造方法,,只要是子類要調用在父類中有同名同參的方法或者同名的屬性,都要用到super來區分,,

關于這部分的資料感覺還是蠻少的,所以這個想法是否正確也不能保證。

還有一個很有意思的東西

package cn.sxt.oop;

public class A {

int i = 12;

}

class B extends A {

int i = -6;

public static void main(String[] args) {

A xx = new B();

System.out.println(xx.i);

}

}

/**

result:

12

**/

B實例的i值是A類的i值,有點懵

關于java子類繼承來的屬性與方法究竟是完全復制還是共用使用相關教程

總結

以上是生活随笔為你收集整理的java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。