我应该使用静态绑定吗?

我正在学习后期绑定和静态绑定。现在我对这些代码感到困惑。

这是我的分析:

  1. hello()是非静态方法,所以我们应该使用动态绑定,即Child。

  2. 但是子类里面没有hello()方法,就去它的父类。查找hello()并打印第一行“Hello from parent call calssMethod”。

  3. 由于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()方法设为静态怎么办?


翻过高山走不出你
浏览 149回答 2
2回答

www说

类(静态)方法不会被重写为实例方法。当您调用方法“hello()”时,它将使用父方法。当您在此处引用类方法时,您指的是在“Parent”类中定义的方法。除此之外,您应该将您的 Child 实例声明为“Parent c = new Child()”。因为您不是向子类添加新方法而是更改实现,所以您不会失去对子类方法的访问权。如果您必须使用返回 Parent 对象的方法,但您返回的是像您一样声明的 Child 对象,则会遇到问题。编辑:除此之外,通常有两个使用继承的原因:专业化和扩展。对于专业化,您使用在超类中定义方法,而您的子类在实现这些方法的方式上有所不同。例如,具有子类 Cat 和 Dog 的超类 Animal。“动物”有一个方法makeSound()。您可以想象这两个子类将有不同的实现。对于扩展,您使用超类作为包含所有重叠内容的基类。除此之外,子类可能有非常不同的实现和用途。很多接口都有这种用途。

不负相思意

每当我们调用子类的对象时,它总是首先找到父类并执行它。由于您在两个类中都有静态 classMethod,因此它始终运行父级的 classMethod 而不是子级的。您只能通过覆盖它来获得所需的答案。如果你将 hello() 方法设为静态,那么它也会给你相同的输出。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java