Ниже представлен мой файл класса Rectangle и файл класса testRectangle с основным методом. Теперь в testRectangle, когда я вызываю метод "периметр" в классе "Прямоугольник", я получаю сообщение об ошибке. Сообщение об ошибке "Я получаю состояния": "Изменить модификатор" периметр() "на" статический ". Метод не может быть статичным, потому что у меня будет несколько различных объектов прямоугольника в основном методе. Я что-то делаю неправильно? будем очень благодарны.
public class Rectangle {
private int length;
private int width;
Rectangle(int len, int wid) {
length = len;
width = wid;
}
public int perimeter(Rectangle rec){
int p = 2*length + 2* width;
return p;
}
}
public class testRectangle {
public static void main(String[] args) {
Rectangle r1 = new Rectangle(5,4);
int r1Perimeter = Rectangle.perimeter(r1);
//the line above this is where I get the error message
//the red squiggly line goes under "Rectangle.perimeter(r1);
}
}
Вы должны вызвать этот метод для объекта Rectangle. Потому что, perimeter()
является методом экземпляра, поэтому вам нужно вызвать экземпляр.
Если perimeter()
является статическим методом, вы можете вызвать его с помощью класса, например Rectangle.perimeter(r1);
int r1Perimeter = r1.perimeter(r1);
И нет необходимости передавать объект Rectangle
там, определить метод perimeter()
как показано ниже
public int perimeter(){
int p = 2*length + 2* width;
return p;
}
Когда вы вызываете Rectangle.perimeter
, где Rectangle
является классом, он разрешен только в том случае, если perimeter
является статическим методом.
Но проблема здесь в том, как вы определили perimeter
:
public int perimeter(Rectangle rec){
Вы действительно хотите, чтобы это был метод экземпляра, потому что вы хотите, чтобы он работал над экземпляром Rectangle
. Поэтому вы действительно не хотите включать параметр Rectangle
. На самом деле, ваш код никогда не использует rec
, поэтому параметр здесь пропадает. Вы должны изменить его на
public int perimeter() {
...
}
а затем вызов Rectangle.perimeter(r1)
становится r1.perimeter()
.
Всякий раз, когда вы вызываете метод класса, в этом случае perimeter()
, компилятор должен знать, какой "прямоугольник" вы имеете в виду. Если вы просто хотите обратиться к Rectangle.perimeter()
, вы не укажете, какой прямоугольник, поэтому компилятор запутается. Создав прямоугольник Rectangle r1 = new Rectangle(5,4)
, вы должны сообщить компилятору, что вы получаете периметр треугольника r1. Для этого вы должны вызвать r1.perimeter()
.
По существу, когда вы определяете метод класса, указатель this
на объект передается вместе с ним, так что компилятор знает, какой конкретный экземпляр Rectangle вы имеете в виду.
Если, с другой стороны, вы действительно хотели вызвать метод с Rectangle.perimeter()
, тогда вы будете ссылаться на метод, который будет одинаковым для каждого прямоугольника. Например, вы можете создать метод getNumSides()
, где независимо от прямоугольника значение всегда будет одинаковым. Чтобы сделать это, вы должны объявить его со static
, что означает, что this
указатель больше не передается при вызове метода. Метод будет объявлен public static int getNumSides()
и будет вызываться с Rectangle.getNumSides()
.
Rectangle.perimeter
это должен бытьr1.perimeter