实例化子类的时候是否内存也实例化一个父类对象?


个人理解:
1,实例化子类不会去自动实例化父类,因为父类有可能是抽象类,抽象类是不能被实例化的
2,不是获得父类的变量,而是子类自己的变量了,你可以创两个不一样的子类,父类的字段给不一样的值都可以,说明这个字段实在子类中单独实例化
3,子类继承父类,就表示子类具有了父类中的成员属性和方法。当成员属性子类属性名与父类属性名相同的时候,父类的属性被隐藏,但还是存在的,我们可以通过super.XXX访问。
4,在子类与父类中:方法存在重写,而属性不存在。


方法重写代码实例:

public class OldParent {
    public String name = "OldParent";
    public OldParent(){
        print();
    }
    public void print(){
        System.out.println("OldParent"+this);
    }
}

public class Parent extends OldParent{
    public String name = "parent";
    public Parent(){
        super();
        print();
    }
    public void print(){
        System.out.println("parent"+this);
    }
}

public class Child extends Parent{

    public String name = "child";
    public static void main(String[] args) {
        Child child = new Child();
    }
    public Child(){
        super();
        print();
    }
    public void print(){
        System.out.println("Child"+this);
    }
}

结果:
Childcom.zhangjunling.Child@2a139a55
Childcom.zhangjunling.Child@2a139a55
Childcom.zhangjunling.Child@2a139a55

此时我们会发现Child 的父类与间接父类中的this都为:@2a139a55。而且,它们的print()都为child的print()方法。因此,我们会得出实例化子类的时候内存并没有实例化父类对象,依旧是子类。

属性覆盖实例

public class OldParent {
    public String name = "OldParent";
    public OldParent(){
        print3();
    }
    public void print3(){
        System.out.println(name);
    }
}
public class Parent extends OldParent{
    public String name = "Parent";
    public Parent(){
        super();
        print2();
    }
    public void print2(){
        System.out.println(name);
    }
}
public class Child extends Parent{

    public String name = "child";
    public static void main(String[] args) {
        Child child = new Child();
    }
    public Child(){
        super();
        print1();
    }
    public void print1(){
        System.out.println(name);
    }
}
结果:
OldParent
Parent
child

可能我们都能想到运行结果,此时这3个结果全是Child child = new Child();全是child的属性,并没有父类对象的属性。

再看下面的代码,结果是否与你想的一样?

public class OldParent {
    public String name = "OldParent";
    public OldParent(){
        print();
    }
    public void print(){
        System.out.println(name);
    }
}
public class Parent extends OldParent{
    public String name = "Parent";
    public Parent(){
        super();
        print();
    }
    public void print(){
        System.out.println(name);
    }
}
public class Child extends Parent{

    public String name = "child";
    public static void main(String[] args) {
        Child child = new Child();
    }
    public Child(){
        super();
        print();
    }
    public void print(){
        System.out.println(name);
    }
}
结果:
null
null
child

此时,我们把方法的重写与属性的覆盖写在一起,又会产生什么结果呢?
结果就是上面的现象!为什么会出现这种结果。

原因是:当我们重写父类的方法时,如果通过子类对象调用父类中重写的方法,结果是全调用的是子类的方法。

那为什么前两个结果全是null?上面已经说的很清楚了,因为调用的是子类的方法,同样属性也是子类的属性。所以在父类中调用name,因为不能访问到子类的name,所以为null。

进一步理解就是:
在child中:我们可以访问的属性有 3 个name:一个是child的,一个是Parent的,一个是OldParent的。我们在child中可以访问这三个name;
在Paren中:我们可以访问的属性有 2 个name:一个是Parent的,一个是OldParent的;
在OldParent中:我们可以访问的属性有 1 个name:就是自己的;

所以,我们可以知道结果为什么是null,null,Child了吧!

第一篇博客,希望给出知道意见,共同学习,共同进步。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值