内存如何分配以及存储在哪里? :Java继承

时间:2013-11-27 13:09:42

标签: java inheritance memory-management

我有一个特定的Java继承问题。 以下是我的代码

class Parent{
    int x = 5;
    public void method(){
        System.out.println("Parent"+ x);
    }
}
public class Child extends Parent{
    int x = 4;
    public void method(){
        System.out.println("Child"+ x);
    }
    public static void main(String[] args){
            Parent p = new Child();
            System.out.println(((Child) p).x);
            System.out.println(p.x);
        }
}

现在我的问题是在运行此程序时实际发生在幕后的事情。

  • 什么得到继承?
  • 在内存位置?
  • 为什么第一个syso给出4,第二个给出5?(我能够 在某种程度上理解,但对上述两个方面的澄清将有所帮助 更清楚地理解它)

请指导

5 个答案:

答案 0 :(得分:1)

在Java中,没有变量覆盖,只有方法覆盖

    System.out.println(((Child) p).x);

该行告诉pChild并获取x变量。

System.out.println(p.x);告诉打印Parent的{​​{1}}

答案 1 :(得分:0)

关于Java inheritanceoverriding的全部内容。父类中的method()将被子方法覆盖。

System.out.println(((Child) p).x);// here you are invoking child 

然后你会得到孩子的属性。

下一个是关于Java多态性的。

 ((Child) p).x // invoking object type, x=4 (object is child ) 

  p.x  // invoking reference type, x=5 (reference is parent)

请参阅此linksthis一个。

答案 2 :(得分:0)

  

什么得到继承?

所有public和protected方法都在子类中继承。字段永远不会被继承。

  

在内存位置?

我在Java中编写了一个关于对象创建过程的blog post。我想你会更好地理解它。

  

为什么第一个syso给出4,第二个给出5?

始终根据引用的声明类型解析字段访问,而不是实际的对象类型。因此,p.x将访问Parent字段,因为p的声明类型为Parent。鉴于,((Child)p).x将访问Child字段,因为您已将引用p转换为Child,现在所考虑的声明类型为Child

答案 3 :(得分:0)

在Java中,将实例化Always子类对象。在实例化子类时,将调用超类构造函数,以便仅声明超类变量并在子类对象中分配内存。并且默认情况下,超类的公共和受保护方法会继承到子类。 因此,总结来说,内存仅分配给子类。您可以在本地使用JDK Java虚拟VM进行验证,以查看实例列表。

答案 4 :(得分:0)

对于继承中的实例变量:假设内存中有两个圆圈

内圈是其中具有父实例变量的父级,外圈是其中具有子实例变量的子级。

子引用可以访问父实例变量,但反之亦然,因为父实例不知道子实例,所以反之亦然
https://i.stack.imgur.com/sR1bS.jpg
https://www.java-forums.org/new-java/96742-how-memory-allocated-during-inheritance.html

class Test1 {       
    public int gear = 10; 
    public int speed =110 ;
} 

// derived class 
class MountainBike extends Test1 
{ 
    //public int gear = 9; 
    public int speed =11 ; 
    // the MountainBike subclass adds one more field 
    //public int seatHeight;
} 

// driver class 
public class Test 
{ 
    public static void main(String args[]) 
    {           
        Test1 mb = new MountainBike(); 
        System.out.println("Hii"+mb.gear); 

        MountainBike m = new MountainBike();

        System.out.println("Hii123 "+m.gear);
    }
} 

上面的代码将输出10..10作为输出。