在Java中,当要执行一个方法时,首先在对象的真实类(定义对象的真实类型)中搜索其声明。如果找不到,则检查超类。如果也没有找到,则检查下一个父类,依此类推。但是,请看下面的示例:
SuperClass s = new SubClass(list of parameter);
s.someMethodExistOnlyInSubClass();
这将给我一个编译时错误。我认为,如上所述,它会首先在someMethodExistOnlyInSubClass()
中寻找SubClass
,验证它是否存在然后立即执行。如果我使用类型SuperClass
的变量来引用SubClass
的实例,则某些参数将通过调用SuperClass
进入super()
的构造函数,并且该对象将是在那里实例化。在这种情况下,其余参数又去了哪里?
答案 0 :(得分:4)
通过将对SubClass
实例的引用分配给类型为SuperClass
的变量,该变量被视为引用了SuperClass
实例。因此,它将不了解SubClass
中明确声明的任何方法。不过请注意,在SubClass
中执行的替代仍然有效。
在您描述的上下文中,要访问someMethodExistOnlyInSubClass()
,必须将s
强制转换为类型SubClass
。看下面:
((SubClass) s).someMethodExistOnlyInSubClass();
答案 1 :(得分:1)
根据其声明类创建对象。
当您将其声明为SuperClass s
时,该对象将没有任何称为someMethodExistOnlyInSubClass
的方法。因此,当您尝试调用此方法时,甚至在查看子类之前,都会遇到编译错误。
对象s
仅约束超类的所有内容,除非您将对象类型强制转换为子类,否则该对象将不知道任何子类。
答案 2 :(得分:1)
仅当在父类和子类中都定义了该方法时,您要尝试做的事情才能起作用。
import java.util.*;
class Parent
{
public void sample()
{
System.out.println("Method of parent is getting Called");
}
}
class Subclass extends Parent
{
public void sample()
{
System.out.println("Method of Child class is getting Called");
}
}
public class Main
{
public static void main(String[] args){
Parent p = new Subclass();
p.sample();
}
}
OUTPUT : Method of Child class is getting Called
如果该方法仅存在于Child类中。您将必须自己创建Child类的实例。
类似这样的东西:
import java.util.*;
class Parent
{
}
class Subclass extends Parent
{
public void sample()
{
System.out.println("Method of Child class is getting Called");
}
}
public class Main
{
public static void main(String[] args){
Subclass p = new Subclass();
p.sample();
}
}
或者您可以像之前的文章中所述键入强制转换
Parent p = new Subclass();
((Subclass)p).sample();