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子类继承来的属性与方法究竟是完全复制还是共用使用...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 余额宝的体验金是什么意思
- 下一篇: java递归 treeview_tree