2016-09-16 35 views
0

这是我的问题。我有一个抽象方法的超类。调用子类对象的抽象方法

public abstract class Base{ 

public abstract Boolean foo(); 

} 
public class sub extends Base{ 
@Override 
public Boolean foo(){ 
    System.out.printLn("This is foo in the sub class!"); 
} 
} 

所以当我去的主,试试这个代码

Base b = new sub(); 
b.foo(); 

我没有错误消息显示我的屏幕上。我的假设是编译器查看b对象,并将其视为Base对象,然后它从Base对象转到foo,并且看到没有实现,然后它从孩子检出foo,然后它看到方法foo是在那里实施,所以它显示的消息。我对吗?

+0

在编译Base时,运行时对象是一个子对象。在运行时对象上调用方法。 –

+0

请参考[Abstract Classes documentation](http://stackoverflow.com/documentation/java/87/inheritance/397/abstract-classes#t=20160916155332004042)。 – Jonathan

+1

谢谢大家,所以调用运行时对象方法foo而不是基类方法foo,因此编译器不会抱怨它。 – MohsenFM

回答

1

编译器没有发现,如果该方法是由子类或不实施。它只检查某个特定类型引用所调用的方法是否存在于类中。在运行时,它决定调用哪个方法意味着基类版本或子类版本。

所以你只是对了“我的假设是编译器查看b对象,并将其视为Base对象,然后它从Base”语句转到foo。

1

编译器没有做太多的处理。在你的情况下 你已经创建了超类的引用变量,它将保存子类的对象。

现在,当您调用该方法时,将根据您的对象类型直接调用您的子类中存在的方法。

我正在添加你的代码和我的评论供你参考。

1),具有抽象类唯一的方法声明

public abstract class Base { public abstract Boolean foo(); //method declaration }

2)儿童类扩展你的父类,你必须实现该方法,如果你正在申报该类混凝土类。

public class sub extends Base { @Override public Boolean foo() { System.out.printLn("This is foo in the sub class!"); } }

3),存储你的目标你的父类子类

Base b = new sub();

4)时,该行的在这里,你已经声明引用变量将执行的编译器将检查对象的类型是什么,并根据对象类型调用该方法。它不会调用t上的方法参考变量的类型。

b.foo();