我正在学习后期绑定和静态绑定。现在我对这些代码感到困惑。
这是我的分析:
所以输出应该是
父调用calssMethod的您好
Child中的classMethod
class Parent{
public static void classMethod() {
System.out.println("classMethod in Parent");
}
public void instanceMethod() {
System.out.println("InstanceMethod in Parent");
}
public void hello() {
System.out.println("Hello from parent call calssMethod");
classMethod();
}
}
class Child extends Parent{
public static void classMethod() {
System.out.println("classMethod in Child");
}
public void instanceMethod() {
System.out.println("InstanceMethod in Child");
}
}
public class AA {
public static void main(String[] args) {
Child c = new Child();
c.hello();
}
}
现在,这是问题所在。 IDE显示输出为:
父调用calssMethod的您好
父类中的classMethod
什么是正确的分析过程?
如果我将hello()方法设为静态怎么办? 谢谢!
答案 0 :(得分:1)
每当我们调用子类的对象时,首先,它总是找到并执行父类。由于两个类都具有静态classMethod,因此它始终运行父类的classMethod而不是子类的。您只能通过覆盖来获得所需的答案。
即使您将hello()方法设置为静态,它也会为您提供相同的输出。
答案 1 :(得分:1)
类(静态)方法不会作为实例方法被覆盖。当您调用方法“ hello()”时,它将使用父方法。当您在此处引用类方法时,即是在“父类”中定义的方法。
除此之外,您应该将Child实例声明为“ Parent c = new Child()”。因为您不是要在子类中添加新方法,而是要更改实现,所以您不会失去对子类方法的访问权限。如果必须使用返回父对象的方法,但又返回声明的子对象的方法,则会遇到问题。
编辑:要补充一点,通常使用继承有两个原因:专业化和扩展。
对于专业化,您可以在超类中使用定义方法,而子类在实现这些方法的方式上有所不同。例如,超类动物具有猫和狗子类。 “动物”具有方法makeSound()
。您可以想象两个子类将具有不同的实现。
对于扩展,您将超类用作包含所有重叠部分的基类。除此之外,子类可能具有截然不同的实现和用法。许多接口都有这种用途。