繁体   English   中英

在这种情况下,继承和多态性如何工作?

[英]How does inheritance and polymorphism work in this situation?

这是头等舱

package test;

public class Project {

public void doSomething (String stuff) {

    writeStuff();
    whichProject(stuff);

}

public void writeStuff(){

    System.out.println("This is stuff");

}


public void whichProject(String stuff){

    System.out.println("This is a random project " + stuff);

}

}

这是派生类

package test;

public class Project1 extends Project{

public void whichProject(String stuff){

    System.out.println("Coding project number one: " + stuff);

}

public static void main(String[] args) {

    Project project = new Project1();

    project.doSomething("stuff");

}

}

运行Project1时,输出结果为:

This is stuff
Coding project number one: stuff

为什么它在Project1中调用whichProject()而不在Project中调用whichProject() 毕竟, doSomething()不是Project中的方法吗? 还是当基类中的某个方法在基类中的另一个方法内部时,那么即使我们在另一个方法内部,变量所引用的对象仍然确定将调用哪个方法调用?

现在,如果我们将whichProject()的修饰符更改为private ,则该类现在是

package test;

public class Project {

public void doSomething (String stuff) {

    writeStuff();
    whichProject(stuff);

}

public void writeStuff(){

    System.out.println("This is stuff");

}


private void whichProject(String stuff){

    System.out.println("This is a random project " + stuff);

}

}

输出变为:

This is stuff
This is a random project stuff

因此,即使变量引用了Project1的对象,现在也将调用Project中的whichProject()方法,而不是一个Project1。 在这种情况下,我完全不了解发生了什么。 (这两种情况的说明whichProject()public改性剂和whichProject()private调整值),将不胜感激。

在Java中,所有方法都是虚拟的。

虚拟方法是可以在派生类中重写的方法,只要子类中的版本具有相同的签名(返回类型和参数)即可。

因此,在Project和Project1的原始版本中,如果您有Project1,则即使从Project方法中的代码也将调用Project1的public void whichProject(String stuff)版本。

但是,如Java语言规范8.4.8.3节所述 ,私有方法不能被覆盖:

请注意,就这些术语的技术意义而言,私有方法不能被隐藏或覆盖。 这意味着子类可以在其超类之一中声明与私有方法具有相同签名的方法,并且不要求此类方法的返回类型或throws子句与私有方法中的私有方法有任何关系。超类。

因此,当Project的doSomthing代码调用whichProject ,它将调用Project的私有版本,而不是Project1的公共版本。

继承遵循自下而上的方法。

因此,使用的writeProject()来自超类类,而whichProject(stuff)来自基类。

您可以参考此示例继承和多态

希望能帮助到你。

对于方法的继承,请使用以下模型:

  1. 收集当前类中的所有方法。
  2. 从超类中添加方法,这些方法是可见的(即,不是private ),并且到目前为止您还没有看到。
  3. 将此列表添加到继承列表中最顶层的类

调用方法时,Java知道实例的类型。 想象一下, this作为一个不可见的方法参数传递给每个方法。 通过查看定义方法的类无法解析方法。

相反,Java使用this ,调用getClass() ,然后如上所述获取方法列表。 因此,即使在执行Project的代码时,它仍然使用Project1列表中的方法。

当您将方法private时,这会改变。 私有方法不能被覆盖,它们根本不会出现在上面的列表中。 相反,Java插入代码以直接调用它,而无需查看列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM