Проблема вызова метода из другого класса

1

Ниже представлен мой файл класса Rectangle и файл класса testRectangle с основным методом. Теперь в testRectangle, когда я вызываю метод "периметр" в классе "Прямоугольник", я получаю сообщение об ошибке. Сообщение об ошибке "Я получаю состояния": "Изменить модификатор" периметр() "на" статический ". Метод не может быть статичным, потому что у меня будет несколько различных объектов прямоугольника в основном методе. Я что-то делаю неправильно? будем очень благодарны.

Rectangle.java

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

testRectangle.java

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

    }
  • 0
    Вы вызываете его как метод класса, когда это только метод экземпляра. Вместо Rectangle.perimeter это должен быть r1.perimeter
Теги:
class
object
methods

3 ответа

2
Лучший ответ

Вы должны вызвать этот метод для объекта Rectangle. Потому что, perimeter() является методом экземпляра, поэтому вам нужно вызвать экземпляр.

Если perimeter() является статическим методом, вы можете вызвать его с помощью класса, например Rectangle.perimeter(r1);

int r1Perimeter = r1.perimeter(r1);

И нет необходимости передавать объект Rectangle там, определить метод perimeter() как показано ниже

public int perimeter(){
   int p = 2*length + 2* width;
   return p;
}
  • 1
    Большое спасибо! Действительно ценю это
0

Когда вы вызываете Rectangle.perimeter, где Rectangle является классом, он разрешен только в том случае, если perimeter является статическим методом.

Но проблема здесь в том, как вы определили perimeter:

public int perimeter(Rectangle rec){

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

public int perimeter() {
    ...
}

а затем вызов Rectangle.perimeter(r1) становится r1.perimeter().

0

Всякий раз, когда вы вызываете метод класса, в этом случае 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().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню