Java 从子类对象调用抽象方法
这是我的问题。我有一个超类,里面有一个抽象方法Java 从子类对象调用抽象方法,java,polymorphism,abstract-class,Java,Polymorphism,Abstract Class,这是我的问题。我有一个超类,里面有一个抽象方法 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!"); } } 因此,当我转到main并尝试此代码时 Base b = new su
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!");
}
}
因此,当我转到main并尝试此代码时
Base b = new sub();
b.foo();
我没有收到任何错误,屏幕上显示消息。我的假设是编译器查看b对象并将其视为基础对象,然后从基础对象转到foo,然后发现没有实现。它从子对象中检出foo,然后看到方法foo在那里实现,因此显示消息。我说得对吗 编译器不做太多的处理。这是你的案子 您已经在超类中创建了引用变量,它将保存子类的对象 现在,当您调用该方法时,它会根据您的对象类型直接调用子类中的方法 我正在为您添加带有注释的代码,供您参考。
1) 仅具有方法声明的抽象类
公共抽象类基类{
公共抽象布尔foo();//方法声明
}
2) 如果要将父类声明为具体类,则子类将扩展必须在其中实现该方法的父类。公共类子类扩展基{
@凌驾
公共布尔foo(){
System.out.printLn(“这是子类中的foo!”);
}
}
3) 这里您已经声明了父类型的引用变量,该父类型存储子类的对象Base b=new sub()代码>
4) 当执行这一行时,编译器将检查对象的类型,并根据对象类型调用该方法。它不会调用引用变量类型的方法
b.foo()代码>编译器不会进行太多的处理。这是你的案子
您已经在超类中创建了引用变量,它将保存子类的对象
现在,当您调用该方法时,它会根据您的对象类型直接调用子类中的方法
我正在为您添加带有注释的代码,供您参考。
1) 仅具有方法声明的抽象类
公共抽象类基类{
公共抽象布尔foo();//方法声明
}
2) 如果要将父类声明为具体类,则子类将扩展必须在其中实现该方法的父类。
公共类子类扩展基{
@凌驾
公共布尔foo(){
System.out.printLn(“这是子类中的foo!”);
}
}
3) 这里您已经声明了父类型的引用变量,该父类型存储子类的对象
Base b=new sub()代码>
4) 当执行这一行时,编译器将检查对象的类型,并根据对象类型调用该方法。它不会调用引用变量类型的方法
b.foo()代码>编译器看不到该方法是否由子类实现。它只检查由特定类类型引用调用的方法是否存在于类本身中。在运行时,它决定调用哪个方法意味着基类版本或子类版本
因此,您只对“我的假设是编译器查看b对象并将其视为一个基本对象,然后它从基本对象转到foo”语句是正确的。编译器不查看该方法是否由子类实现。它只检查由特定类类型引用调用的方法是否存在于类本身中。在运行时,它决定调用哪个方法意味着基类版本或子类版本
因此,您只对“我的假设是编译器查看b对象并将其视为基本对象,然后从基本对象转到foo”语句进行了正确的解释。编译基本对象时,运行时对象是一个子方法。在运行时对象上调用。请参阅。谢谢大家,因此,调用的是运行时对象方法foo,而不是基类方法foo,因此编译器不会对此抱怨。编译基类时,运行时对象是一个子方法。在运行时对象上调用方法。请参阅。谢谢大家,因此,调用的是运行时对象方法foo,而不是基类方法foo,因此编译器不会对此抱怨。