【问题标题】:Java Constructors: Error "actual and formal argument lists differ in length"Java 构造函数:错误“实际参数列表和形式参数列表的长度不同”
【发布时间】:2020-08-13 05:02:47
【问题描述】:

我一直在拼命尝试让这段代码工作。这是我第一次使用对象/构造函数(我是一名新程序员),这让我很困惑。我会完全诚实的;我不知道问题是什么。我已经尝试了很多东西,所以这段代码很乱。我也受够了,再次开始编写第二个代码,由于与第一个代码相同的原因,它也不起作用,尽管该代码的结构略有不同。我将在下面发布这两种尝试,希望有人能看到我的错误。谢谢!

尝试 1:

class Circle
{
    private static double r;
    public static double rd;
    public double Circle( double r, double rd )
 {
        r = rd;
        return r;
 }
    public double calCircumference(double r)
 {
        return 2*Math.PI*r;
}
    public static double calArea(double r)
{
        return Math.PI*r*r;
}

}
class CircleApp
{
    public static void main( String[] args )
{
        double rd = Double.parseDouble( args[0] );
        System.out.println( "Circle radius = " + rd );

        // create an object of Circle with the radius rd
        Circle circle1 = new Circle();
        double cir = circle1.calCircumference();
        double area = circle1.calArea();
        System.out.println("Circumference = " + cir);
        System.out.println("Area = " + area);
    }
}

尝试 2:

class Circle
{   
    public double rd = Double.parseDouble( args[0] );   
    private double r;

    public void Circle( double rd )
 {
    double r = rd;
 }
    private double calCircumference(double r)
 {
        return 2*Math.PI*r;
}
    public double calArea()
{
        return Math.PI*r*r;
}
}
class CircleApp2
{
    public static void main( String[] args )
{
        System.out.println( "Circle radius = " + rd );
        // create an object of Circle with the radius rd
        Circle circle1 = new Circle( rd);
        double cir = circle1.calCircumference();
        double area = circle1.calArea();
        System.out.println("Circumference = " + cir);
        System.out.println("Area = " + area);
}
}

任何帮助将不胜感激。另外,因为我认为我的编码可能会让你们中的大多数人想扯掉我的脑袋,所以请批评它的任何部分。我只是在这里开始学习过程,所以任何反馈/批评都会非常有帮助。再次感谢!

【问题讨论】:

  • calCircumference(double r) 期望给出double。这很奇怪,因为 Circle 实例已经有一个半径字段。你为什么不用这个?

标签: java oop object constructor


【解决方案1】:

这里有各种各样的问题。

首先,在这两个版本中,您声明的是方法,而不是构造函数。这是一个方法声明:

public double Circle( double r, double rd )

这是一个构造函数声明:

public Circle( double r, double rd )

构造函数没有指定返回类型。

接下来,在您的第一次尝试中,您有一条评论说您正在创建一个半径为rd 的圆,但实际上您并没有传入rd

// create an object of Circle with the radius rd
Circle circle1 = new Circle();

应该是这样的

Circle circle1 = new Circle(rd);

...但在尝试 1 中,您在 method-that-should-be-a-constructor 中获得了两个参数,而您只需要 1 个参数。

在尝试 2 中,您尝试在 CircleApp2 中使用 rd 变量,但它只是在 Circle... 中声明...并且该声明不起作用,因为它是尝试使用args,它只存在于main中。

一个问题是您在尝试构建之前编写了太多代码。当您无法创建实例时,编写计算周长和面积的方法是没有意义的。从最小的代码开始,编译 that,然后你就可以添加它了。这是我对起点的建议:

// I generally go along with the idea of "design for inheritance or prohibit it",
// hence the class being declared as final, but you probably don't need to worry about
// that too much when you're starting out.
public final class Circle
{
    // I'd recommend making fields final where possible, and giving them
    // more meaningful names than "r" or "rd". (It's not *too* bad in the
    // context of a circle, but "radius" is still better.
    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }
}

public final class CircleApp {
    public static void main(String[] args) {
        double radius = Double.parseDouble(args[0]);
        Circle circle = new Circle(radius);
    }
}

现在要查看的代码要少得多 - 因此,如果您不理解某些内容,则更容易查明它是什么。

【讨论】:

    【解决方案2】:

    构造函数不是void 方法。这个

    public void Circle( double rd )
    

    应该是

    public Circle( double rd ){
        this.r = rd;
    }
    

    那么下一期就是

    private double calCircumference(double r)
    

    应该是

    private double calCircumference()
    

    public double rd = Double.parseDouble( args[0] ); 
    

    没有意义,这不在main 中。把所有东西放在一起,

    class Circle {
        private double r;
    
        public Circle(double rd) {
            this.r = rd;
        }
    
        public double calCircumference() {
            return 2 * Math.PI * r;
        }
    
        public double calArea() {
            return Math.PI * r * r;
        }
    }
    

    然后

    class CircleApp2 {
        public static void main(String[] args) {
            double rd = Double.parseDouble(args[0]);
            System.out.println("Circle radius = " + rd);
            // create an object of Circle with the radius rd
            Circle circle1 = new Circle(rd);
            double cir = circle1.calCircumference();
            double area = circle1.calArea();
            System.out.println("Circumference = " + cir);
            System.out.println("Area = " + area);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2015-07-25
      • 2016-05-31
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多