Java Конструкторы: Ошибка «фактические и формальные списки аргументов различаются по длине» - PullRequest
0 голосов
/ 29 апреля 2020

Я отчаянно пытался заставить этот кусок кода работать. Я впервые работаю с объектами / конструкторами (я новый программист), и это меня смущает. Я буду совершенно честен; Я не знаю, в чем проблема. Я пробовал много вещей, поэтому этот код довольно грязный. Я также сыт по горло и начал снова делать второй код, который также не работает по той же причине, что и первый, хотя этот код немного отличается. Ниже я опубликую обе попытки в надежде, что кто-то увидит мою ошибку. Спасибо!

Попытка 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);
}
}

Любая помощь будет принята с благодарностью , Кроме того, поскольку я предполагаю, что мое кодирование, вероятно, заставит большинство из вас хотеть оторвать мою голову, пожалуйста, критикуйте любую его часть. Я только начинаю процесс обучения здесь, поэтому любые отзывы / критические замечания были бы очень полезны. Еще раз спасибо!

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Здесь возникают различные проблемы.

Во-первых, в обеих версиях вы объявляете методы , а не конструкторы. Это объявление метода:

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 вы также получили два параметра в методе, который должен быть конструктором, где вы хотите только 1.

При попытке 2, вы пытаетесь использовать переменную rd в CircleApp2, но она только объявлена ​​ в Circle ... и это объявление не будет работать, потому что оно пытается использовать args , которая существует только в main.

Одна из проблем заключается в том, что вы написали слишком много кода перед попыткой сборки. Нет смысла писать методы для вычисления окружности и площади, пока вы не можете создать экземпляр. Начните с минимального кода, получите , который компилирует, и затем вы можете добавить к нему. Вот мое предложение для отправной точки:

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

Теперь кода гораздо меньше, чтобы на него смотреть - поэтому, если вы чего-то не понимаете, вам будет легче точно определить, что это такое.

1 голос
/ 29 апреля 2020

Конструкторы не являются 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...