为了账号安全,请及时绑定邮箱和手机立即绑定

我应该使用静态绑定吗?

我应该使用静态绑定吗?

翻过高山走不出你 2023-03-17 16:42:43
我正在学习后期绑定和静态绑定。现在我对这些代码感到困惑。这是我的分析: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()。您可以想象这两个子类将有不同的实现。

对于扩展,您使用超类作为包含所有重叠内容的基类。除此之外,子类可能有非常不同的实现和用途。很多接口都有这种用途。


查看完整回答
反对 回复 2023-03-17
?
不负相思意

TA贡献1777条经验 获得超10个赞

每当我们调用子类的对象时,它总是首先找到父类并执行它。由于您在两个类中都有静态 classMethod,因此它始终运行父级的 classMethod 而不是子级的。您只能通过覆盖它来获得所需的答案。

如果你将 hello() 方法设为静态,那么它也会给你相同的输出。


查看完整回答
反对 回复 2023-03-17
  • 2 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号