Драйверы для классов в Java «Прямоугольник»

Я никогда не использовал отдельный файл для драйвера в Java. Я привык использовать только основной метод. Я использовал отдельные файлы в Python, но Java — новинка. Ниже мой код для каждого класса («Прямоугольник» и «Драйвер»), каждый из отдельных файлов.

Обновление с изменением методов на статические: не обращайте внимания на изменение имен классов или форматирования… я просто настраиваю, чтобы это работало с MyProgrammingLab. Мне все еще нужно добавить параметры длины и ширины только между 0,0 и 20,0 (простые операторы if-else).

import java.util.Scanner;

Драйвер открытого класса {

public static void main(String[] args) {

    Scanner input = new Scanner( System.in);

    System.out.print("Enter length of rectangle:");
    double length = input.nextDouble();
    System.out.print("Enter width of rectangle:");
    double width = input.nextDouble();

    Rectangle  Perimeter = new Rectangle(length, width);
    Perimeter.getPerimeter();
    Rectangle  Area = new Rectangle(length, width);
    Area.getArea();

    System.out.printf("Area: %.1f, Perimeter: %.1f",Rectangle.getArea(),Rectangle.getPerimeter());

}

}

окончательный класс прямоугольник {

private static double mLength;
private static double mWidth;

public Rectangle(double length, double width){
    mLength = length;
    mWidth = width;
}   
public double getLength(){
    return mLength;
}

public double getWidth(){
    return mWidth;
}

public static double getArea(){
    double area = mWidth*mLength;
    return area;    
}
public static double getPerimeter(){
    double perimeter = (mWidth*2)+(mLength*2);
    return perimeter;

}

}


person Trey Howerton    schedule 28.03.2017    source источник


Ответы (2)


Конструктор по умолчанию предоставляется компилятором, если конструктор не написан явно.

Но если вы явно пишете любой конструктор в классе, то всякий раз, когда вы вызываете конструктор, будь то без аргументов или с аргументами, он всегда будет искать явно определенный конструктор в классе.

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

Поэтому либо явно напишите конструктор без аргументов в Rectangle и используйте setter для установки его атрибутов, либо просто используйте конструктор аргументов в своем методе.


Добавить в Rectangle.class пустой конструктор:

public Rectangle() {

} 

Или используйте конструктор, объявленный с параметрами в вашем методе

Rectangle rectangle = new Rectangle(length, width);

В вашем случае вы неправильно используете объект прямоугольника. Я думаю, что вы хотите сделать это:

Rectangle  rectangle = new Rectangle(length , width );
System.out.printf("Area: %.1f, Perimeter: %.1f",rectangle.getArea() ,rectangle.getPerimeter());
person TheBakker    schedule 28.03.2017
comment
Или, если можно, удалите сеттеры и передайте аргументы вызовам конструктора. - person James Fry; 29.03.2017
comment
Я получаю сообщения об ошибках Formatter, когда пробовал оба этих варианта. Любой совет? Вам нужно что-то большее, чем просто это... - person Trey Howerton; 29.03.2017
comment
Я тестировал его без моего «printf». Он пытается напечатать местоположение памяти Area и Perimeter вместо фактического значения. Я удалил свои сеттеры и вместо этого передал аргументы, но не уверен, почему он печатает этот вывод. Пример: Площадь:Прямоугольник@211d0a4f Периметр: Прямоугольник@798fd984 - person Trey Howerton; 29.03.2017
comment
Он печатает метод toString() по умолчанию, который является ссылкой на объект Rectangle. Я думаю, что ты хочешь сделать это: Rectangle rectangle = new Rectangle(length , width ); System.out.printf("Area: %.1f, Perimeter: %.1f",rectangle.getArea() ,rectangle.getPerimeter()); - person TheBakker; 29.03.2017
comment
могу ли я объединить это, когда я как-то вызываю Area.getArea()? - person Trey Howerton; 29.03.2017
comment
Как работает ваш код. Область — это просто прямоугольник без длины и ширины. Кроме того, что вы подразумеваете под конкатенацией? - person TheBakker; 29.03.2017
comment
Вы имеете в виду : System.out.printf("Area: " + rectangle.getArea() + ", Perimeter: " + rectangle.getPerimeter()); - person TheBakker; 29.03.2017
comment
О, я понял! Идеальный! Объединение - неправильное слово? Area.getArea().toString(); - person Trey Howerton; 29.03.2017
comment
Для информации в java вы хотите, чтобы имя вашей переменной начиналось с нижнего регистра. Также вызов вашего прямоугольника Area кажется вводящим в заблуждение. И я не уверен, чего именно вы пытаетесь добиться с помощью toString? - person TheBakker; 29.03.2017
comment
Это было просто то, что я видел, как профессор делал мимоходом во время занятия. На самом деле я никогда не использовал его так раньше. Я использовал ваш код выше (и javaguy), и он работает, но мне пришлось изменить свои методы на статические, прежде чем он заработает. Спасибо за помощь! - person Trey Howerton; 29.03.2017
comment
Вам не нужно этого делать, может быть, вы можете обновить свою оду, чтобы мы могли видеть, что происходит. - person TheBakker; 29.03.2017

Имеет смысл создать объект Rectangle с его длиной и шириной, поэтому используйте перегруженный конструктор Rectangle, передав аргументы length и width (введенные пользователем), как показано ниже:

Rectangle  Perimeter = new Rectangle(length, width);

конструктор Rectangle() не определен. Кто-нибудь может помочь?

Важным моментом является то, что когда у вас есть перегруженный конструктор, как в вашем классе Rectangle (где нет конструкторов по умолчанию, т.е. нет написанных конструкторов аргументов), вы не можете создать объект, используя new Rectangle();, потому что компилятор не добавить конструктор по умолчанию автоматически для вас. Я предлагаю посмотреть здесь для более подробной информации.

Кроме того, если вы хотите распечатать объект Rectangle с деталями length и width, вам необходимо использовать метод override toString() из метода java.lang.Object, как показано ниже:

public class Rectangle {

    private double mLength;

    private double mWidth;

    //add your code here as is

    @Override
    public String toString() {
        return "Rectangle [mLength=" + mLength + ", mWidth=" + mWidth + "]";
    }
}
person developer    schedule 28.03.2017
comment
Спасибо! Я воспользовался вашим предложением, так как оно было таким же, как у TheBakker ниже. Смотрите комментарий в его теме... - person Trey Howerton; 29.03.2017
comment
Спасибо… Я понял, но мне пришлось изменить getArea и getPerimeter на статические. Вроде не вызывает никаких проблем, но можете ли вы объяснить, почему? - person Trey Howerton; 29.03.2017