我正在学习后期绑定和静态绑定。现在我对这些代码感到困惑。这是我的分析:hello()是非静态方法,所以我们应该使用动态绑定,即Child。但是子类里面没有hello()方法,就去它的父类。查找hello()并打印第一行“Hello from parent call calssMethod”。由于classMethod()是静态的,所以我们应该使用c的静态绑定,也就是Child。所以输出是“child 中的 classMethod”。所以输出应该是来自父调用 calssMethod 的问候子类中的类方法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 的问候父类中的类方法什么是正确的分析过程?如果我将hello()方法设为静态怎么办?
2 回答
www说
TA贡献1775条经验 获得超8个赞
类(静态)方法不会被重写为实例方法。当您调用方法“hello()”时,它将使用父方法。当您在此处引用类方法时,您指的是在“Parent”类中定义的方法。
除此之外,您应该将您的 Child 实例声明为“Parent c = new Child()”。因为您不是向子类添加新方法而是更改实现,所以您不会失去对子类方法的访问权。如果您必须使用返回 Parent 对象的方法,但您返回的是像您一样声明的 Child 对象,则会遇到问题。
编辑:除此之外,通常有两个使用继承的原因:专业化和扩展。
对于专业化,您使用在超类中定义方法,而您的子类在实现这些方法的方式上有所不同。例如,具有子类 Cat 和 Dog 的超类 Animal。“动物”有一个方法makeSound()。您可以想象这两个子类将有不同的实现。
对于扩展,您使用超类作为包含所有重叠内容的基类。除此之外,子类可能有非常不同的实现和用途。很多接口都有这种用途。
不负相思意
TA贡献1777条经验 获得超10个赞
每当我们调用子类的对象时,它总是首先找到父类并执行它。由于您在两个类中都有静态 classMethod,因此它始终运行父级的 classMethod 而不是子级的。您只能通过覆盖它来获得所需的答案。
如果你将 hello() 方法设为静态,那么它也会给你相同的输出。
添加回答
举报
0/150
提交
取消
