我有一个特定的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);
}
}
现在我的问题是在运行此程序时实际发生在幕后的事情。
请指导
答案 0 :(得分:1)
在Java中,没有变量覆盖,只有方法覆盖。
System.out.println(((Child) p).x);
该行告诉p
点Child
并获取x
变量。
行System.out.println(p.x);
告诉打印Parent
的{{1}}
答案 1 :(得分:0)
关于Java inheritance
和overriding
的全部内容。父类中的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)
答案 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://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作为输出。