Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从子类对象调用抽象方法_Java_Polymorphism_Abstract Class - Fatal编程技术网

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,因此编译器不会对此抱怨。