这是头等舱

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()不是Project中的方法吗?还是当基类中的某个方法在基类中的另一个方法内部时,那么即使我们在另一个方法内部,变量所引用的对象仍然确定将调用哪个方法调用?

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

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的一个对象。在这种情况下,我完全不了解发生了什么。对于两种情况(带有public修饰符的whichProject()和带有private修饰符的)的解释将不胜感激。

最佳答案

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

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

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

但是,如section 8.4.8.3 of the Java Language Specification中所述,私有方法不能被覆盖:


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


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

关于java - 在这种情况下,继承和多态性如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19840080/

10-13 00:02