下面是我的类文件Rectangle和带有main方法的类文件testRectangle。现在在testRectangle中,当我调用类“Rectangle”中的方法“perimeter”时,我收到一条错误消息。我收到的错误消息指出,“将'perimeter()'的修饰符更改为'static'。该方法不能是静态的,因为我在main方法中会有几个不同的矩形对象。我做错了吗?任何帮助都会非常感谢。
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);
}
}
答案 0 :(得分: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()
。
答案 2 :(得分: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()
进行调用。