程序如何决定使用哪个方法 运行 因为对象是子对象 class

How does the program decides which method to run because the object is of child class

所以我有以下代码:

import java.util.Scanner;

class Shape{
   double length, breadth;

   Shape(double l, double b) { //Constructor to initialize a Shape object  
      length = l;
      breadth = b;
   }

   Shape(double len) { //Constructor to initialize another Shape object  
      length = breadth = len;
   }

   double calculate(){ // To calculate the area of a shape object
      return length * breadth ;
   }
}

public class Test1 extends Shape {
   double height;

   Test1(double l, double h) {
      super(l);
      height = h;
   }

   Test1(double l, double b, double h) {
      super(l, b);
      height = h;
   }
   @Override
   double calculate(){
      return length*breadth*height;
   }   

   public static void main(String args[]) {
       Scanner sc = new Scanner(System.in);
       double l=sc.nextDouble();
       double b=sc.nextDouble();   
       double h=sc.nextDouble(); 
    
       Test1 myshape1 = new Test1(l,h);
       Test1 myshape2 = new Test1(l,b,h);
    
       double volume1;
       double volume2;
    
       volume1 = myshape1.calculate();
       volume2 = myshape2.calculate();
    
       System.out.println(volume1);
       System.out.println(volume2);
   }
}

我不明白它是如何决定 calculate() 方法中的哪一个到 运行 的,因为它们都是从子 class 对象调用的,但其中一个决定运行 父 class 方法。

是否与构造函数重载有关?如果是怎么办?

构造函数重载与“哪个方法运行”无关。构造函数仅用于初始化实例,“运行哪个方法”可能是与方法重载相关的问题,而您的问题并非如此。

在这两种情况下:

volume1 = myshape1.calculate();
volume2 = myshape2.calculate();

Test1calculate() 的最低可用实现 ... -> java.lang.Object class 层次结构被调用 - 即 Test1::calculate,在你的情况下。

不是调用超级class的calculate(),而是你的class的calculate()使用从 superclass Shape 继承的字段,如:

double calculate(){
      return length*breadth*height;
}

当你实例化class时,它是用它的superclasses的所有成员(甚至是私有的)创建的,这就是你使用superclasses的字段的原因,就好像它们是在相关 class 中定义的。

旁注:private superclass 的成员不能直接访问,在 subclass 中。您需要适当的 accessors/getters 才能访问它们。

如果方法不是privatestaticfinal,则默认方法是虚拟的。

即采用最低class的方法
您已覆盖 Test1 中的方法,因此将调用它。我建议你在一个方法上写 @Override 来向你自己和其他人表明这个方法是继承的。