Java 如何从子类访问超类的参数化构造函数?
我试图使用参数化构造函数访问超类的calculate()方法,在这里我只想要面积而不是体积,但我没有这样做,而是访问了子类calculate(),它生成的o/p为0。我如何解决这个问题Java 如何从子类访问超类的参数化构造函数?,java,inheritance,constructor,Java,Inheritance,Constructor,我试图使用参数化构造函数访问超类的calculate()方法,在这里我只想要面积而不是体积,但我没有这样做,而是访问了子类calculate(),它生成的o/p为0。我如何解决这个问题 import java.util.Scanner; class Shape { double length, breadth; Shape(double l, double b) { length = l; breadth = b; }
import java.util.Scanner;
class Shape
{
double length, breadth;
Shape(double l, double b)
{
length = l;
breadth = b;
}
Shape(double len)
{
length = len;
breadth = len;
}
double calculate()
{
return length * breadth;
}
}
public class Test1 extends Shape
{
double height;
Test1(double x, double y)
{
super(x, y);
}
Test1(double p, double q, double r)
{
//super(2.0);
height = r;
length = p;
breadth = q;
}
double calculate()
{
return length * breadth * height;
}
public static void main(String args[])
{
Test1 myshape1 = new Test1(2, 4);
Test1 myshape2 = new Test1(2, 3, 4);
double volume1;
double volume2;
volume1 = myshape1.calculate();
volume2 = myshape2.calculate();
System.out.println(volume1);
System.out.println(volume2);
}
}
这些类名令人困惑。什么是形状?假设您计算的面积等于
长度*宽度
,那么它很可能只是一个矩形
Test1
我猜是一个长方体
如果没有指定高度,您希望它是多少?长方体有一个高度。您无法计算它的面积(length*width
),因为它对3D对象没有意义。总表面积,或单个表面的面积,可能
如果需要矩形,请实例化一个矩形。如果希望高度不默认为零,请使用不同的默认值,如1
我会这样写:
class Rectangle
{
final double length, width;
Rectangle(double length, double width)
{
this.length = length;
this.width = width;
}
}
class Cuboid extends Rectangle
{
final double height;
Cuboid(double length, double width, double height)
{
super(length, width);
this.height = height;
}
Cuboid(double length, double width)
{
this(length, width, 1);
}
double volume()
{
return length * width * height;
}
public static void main(String args[])
{
Cuboid myshape1 = new Cuboid(2, 4);
Cuboid myshape2 = new Cuboid(2, 3, 4);
double volume1;
double volume2;
volume1 = myshape1.volume();
volume2 = myshape2.volume();
System.out.println(volume1);
System.out.println(volume2);
}
}
当您扩展一个类并覆盖一个方法时,您是在说实现该功能是儿童的责任。因此,您不能访问子类之外的父函数。解决方案是将myshape1类改为Shape而不是Teste1。否则你必须改变你的方法。还要注意的是,一旦您重新实现了几乎所有的方法,您就不会使用您的超类(这是继承的目标)。我会这样做:
import java.util.Scanner;
class Shape{
double length, breadth;
public Shape(double l, double b){
length = l;
breadth= b;
}
public Shape(double len){
length = len;
breadth = len;
}
double calculate(){
return length * breadth ;
}
}
public class Test1 extends Shape{
double height;
public Test1(double x, double y){
super(x,y);
height = 1d;
}
public Test1(double p, double q, double r){
super(p, q);
height=r;
}
double calculate()
{
return super.calculate()*height;
}
public static void main(String args[]){
Test1 myshape1 = new Test1(2,4);
Test1 myshape2 = new Test1(2,3,4);
double volume1;
double volume2;
volume1 = myshape1.calculate();
volume2=myshape2.calculate();
System.out.println(volume1);
System.out.println(volume2);
}
}
构造函数与
计算有什么关系?确切的输入是什么,确切的预期输出与实际输出是什么,为什么您认为代码的行为应该不同?为什么您要这样编码?如果您想要面积和体积,为什么不创建两个不同的方法,并在扩展形状的特定类中重写它们的特定实现(如果它们不同,例如圆形
)。您的问题没有真正意义。从语义上讲,可以调用super.calculate()
来引用父类实现。对于多重继承的情况,您可以指定哪个父类/接口:Shape.super.calculate()
。也就是说,这里的用例有点奇怪。对于3D类中的2D形状,我认为高度为0,因为这会导致体积为0。但总的来说,这不必要地限制了将维度耦合到特定字段,而不强制执行它们。更好的方法是使用三个坐标点,并使用其中两个来构建长方体unambiguously@Rogue我认为这里对继承的介绍有点可疑。长方体不是矩形,除非从特定位置(在本例中为上/下)查看时正在计数。所以是的,当我说这是“我将如何写它”时,我有点夸张了。但无论如何,如果您只计算体积,则三维是一个很好的表示形式。在讨论对象相对于某个参考点之前,不需要坐标系。如果你想考虑一个1x1x2的对象和一个2x1x1的对象是一样的。从表面上看,它们不是;但任何人都可以看到他们会是怎样的。从数学上讲,矩形是一个具有0值三维度的长方体(与二维对象一样,它在我们的三维世界中并不存在)。三坐标建议只是一个备选方案的建议(基于您的答案),我实际上同意您上面所写的解决方案。另外,原始问题被Test1
中的两个构造函数弄得更加混乱。模糊性致命。虽然这个答案很有帮助,并说明了op应该如何解决这个问题,但它并没有再次解决op关于如何“访问超类的calculate()方法”的问题,您可以通过super
调用访问类内的任何继承方法。这让我很困惑,因为你说你不能,然后在你的代码示例中使用它。编辑:我被语法困住了,我明白你在说什么了