程序如何决定使用哪个方法 运行 因为对象是子对象 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();
Test1
中 calculate()
的最低可用实现 ... -> 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 才能访问它们。
如果方法不是private
、static
或final
,则默认方法是虚拟的。
即采用最低class的方法
您已覆盖 Test1
中的方法,因此将调用它。我建议你在一个方法上写 @Override
来向你自己和其他人表明这个方法是继承的。
所以我有以下代码:
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();
Test1
中 calculate()
的最低可用实现 ... -> 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 才能访问它们。
如果方法不是private
、static
或final
,则默认方法是虚拟的。
即采用最低class的方法
您已覆盖 Test1
中的方法,因此将调用它。我建议你在一个方法上写 @Override
来向你自己和其他人表明这个方法是继承的。