无法从另一个类调用方法

时间:2014-04-29 00:07:07

标签: java class object methods

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

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

    }

3 个答案:

答案 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()进行调用。