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

Java 在这种情况下,继承和多态性是如何工作的?,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,这是头等舱 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){

这是头等舱

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中调用?毕竟,
doSomething()
不是项目中的一种方法吗?或者,当基类中有一个方法位于基类中另一个方法的内部时,即使我们位于另一个方法的内部,变量所引用的对象仍会确定将调用哪个方法调用

现在,如果我们将
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

因此,现在正在调用Project中的
whichProject()
方法,而不是一个Project1,即使变量引用Project1的对象。在这种情况下,我完全不明白发生了什么。对于这两种情况(
whichProject()
带有
public
修饰符和
whichProject()
带有
private
修饰符)的解释将不胜感激

继承遵循自底向上的方法

所以使用的
writeProject()
来自超类,而
项目(stuff)
来自基类

你可以参考这个例子


希望有帮助。

要继承方法,请使用以下模型:

  • 收集当前类中的所有方法
  • 添加超类中的方法,这些超类是可见的(即非
    private
    ),并且是迄今为止您尚未看到的
  • 将此列表添加到继承列表中最顶层的类
  • 调用方法时,Java知道实例的类型。假设
    作为一个不可见的方法参数传递给每个方法。方法不是通过查看定义方法的类来解析的

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


    当您将方法设置为私有时,这会发生变化。私有方法不能被覆盖,它们不会显示在上面的列表中。相反,Java插入代码直接调用它,而不查看列表。

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

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

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

    但是,如中所述,不能重写私有方法:

    请注意,在这些术语的技术意义上,私有方法不能隐藏或重写。这意味着子类可以在其一个超类中声明具有与私有方法相同签名的方法,并且不要求此类方法的返回类型或抛出子句与超类中私有方法的返回类型或抛出子句具有任何关系


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

    重复问题,请先搜索此问题。参观