Java 如何从子类访问超类的参数化构造函数?

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; }

我试图使用参数化构造函数访问超类的calculate()方法,在这里我只想要面积而不是体积,但我没有这样做,而是访问了子类calculate(),它生成的o/p为0。我如何解决这个问题

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
调用访问类内的任何继承方法。这让我很困惑,因为你说你不能,然后在你的代码示例中使用它。编辑:我被语法困住了,我明白你在说什么了