抽象类Parent { int i = 9;
void display() {
System.out.println("base");
}
}
class Child extends Parent { int i = 8;
public void display() {
System.out.println("derived");
}
}
公共类A {
public static void main(String args[]) {
Parent a1 = new Child();
a1.display(); // calls child class method
System.out.println(a1.i);// calls parent class member
}
}
答案 0 :(得分:1)
您无法直接访问Parent
类display()
方法而无需创建对象。
但是你可以从你的子类中访问它。比如这个
class Child extends Parent {
int i = 8;
public void display() {
super.display();
System.out.println("derived");
}
}
根据java docs Accessing Superclass Members
如果您的方法覆盖了其超类的方法之一,则可以通过使用关键字super来调用重写方法。您也可以使用super来引用隐藏字段(尽管不鼓励隐藏字段)。
答案 1 :(得分:1)
当我运行此代码时,正在调用派生类的显示方法
看起来您已使用其他编程语言(如C ++或C#)进行编程,您必须将方法指定为virtual
才能使用子类方法。在Java中,除private
,final
和static
之外的所有方法都是虚拟的。
知道这一点,因为Child
类已经覆盖display
类的Parent
方法,当你这样做时:
Parent a1 = new Child();
a1.display();
a1.display
将执行实际对象引用类的display
方法,在本例中为Child#display
。
要修复代码,请将a1
的初始化更改为新的Parent
:
Parent a1 = new Parent();
a1.display();
更多信息:
编辑完成后,现在您在控制台中打印a1
时遇到问题,可能是打印9
而不是8
。你在这里做的是隐藏字段。字段不被覆盖,因此i
变量的值将取决于为变量声明的实际类类型。由于您已将a1
声明为Parent
,因此a1.i
将采用Parent#i
的值。
要修复此代码,请将a1
变量类型更改为Child
:
Child a1 = new Child();
System.out.println(a1.i);
a1.display();
或者更好的解决方案:从不尝试覆盖字段,更糟糕的是,不要尝试直接从其他类访问类字段,而是使用相应的 getters 和 setters 。
更多信息:
如果在中级父类重写它时如何访问祖先类的方法?
假设这是你真正的问题,那么答案很简单:你做不到。
答案 2 :(得分:0)
如果我理解你的问题,你试图使用CHILD实例调用PARENTS显示方法。
使用只派生类对象,有 NO 方式指示编译器对基类版本进行非虚拟调用。
答案 3 :(得分:0)
你不能。如果您希望执行父类中的代码,那么您必须创建父类(注意:Parent
不是抽象类)或者您必须在其中一个方法中调用super.someMethod()
孩子例如:
public void display() {
super.display();
System.out.println("derived");
}
答案 4 :(得分:0)
我认为你要问的是为什么要显示父类的变量和子类的方法。
首先,覆盖不应用于变量,它应用于方法。无论引用属于哪个类,该变量都将立即显示。在您的代码中,
Parent a1 = new Child();
System.out.println(a1.i);
这里a1是对Parent类的引用,因此显示了Parent类的变量。
在方法的情况下,在运行时决定调用哪种方法。调用该方法创建其对象,此处Child类的对象为c Parent a1 =new Child();
。请参阅 new Child()部分,从而查看Child类方法。但请记住,此方法应存在于引用所属的类中。例如
Class Parent
{
}
Class Child extends Parent
{
public void display()
{
System.out.println("derived");
}
public static void main (String []args)
{
Parent a1 = new Child();
a1.display(); //Error
}
}
要在原始示例中调用基类方法,请使用super,如其他人所提到的那样。或者只是创建父类的对象
Parent o = new Parent();
o.display(); //prints base