【问题标题】:Trouble calling a method from another class从另一个类调用方法时遇到问题
【发布时间】:2014-04-29 00:07:07
【问题描述】:

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

矩形.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);
        }

    }

【问题讨论】:

  • 当它只是一个实例方法时,您将它称为类方法。而不是Rectangle.perimeter 应该是r1.perimeter

标签: java class object methods


【解决方案1】:

您必须在 Rectangle 对象上调用该方法。因为perimeter()是一个实例方法,所以你必须调用一个实例。

如果perimeter()是一个静态方法,那么你可以用Class调用它,比如Rectangle.perimeter(r1);

int r1Perimeter = r1.perimeter(r1);

并且没有必要在那里传递Rectangle对象,定义perimeter()方法如下

public int perimeter(){
   int p = 2*length + 2* width;
   return p;
}

【讨论】:

  • 非常感谢!真的很感激
【解决方案2】:

当您调用Rectangle.perimeter 时,其中Rectangle 是一个类,只有当perimeter 是一个静态 方法时才允许。

但这里的问题在于您如何定义perimeter

public int perimeter(Rectangle rec){

您确实希望这是一个实例方法,因为您希望它在Rectangle 的实例上工作。所以你真的不想包含Rectangle 参数。事实上,你的代码体从来没有使用rec,所以这里的参数是浪费的。你应该把它改成

public int perimeter() {
    ...
}

然后调用Rectangle.perimeter(r1)变成r1.perimeter()

【讨论】:

    【解决方案3】:

    每当您调用类方法时,在本例中为perimeter(),编译器需要知道您指的是哪个“矩形”。如果您只是引用Rectangle.perimeter(),您并没有指定 which 矩形,因此编译器会感到困惑。一旦你创建了一个矩形Rectangle r1 = new Rectangle(5,4),你必须让编译器知道你得到了三角形r1的周长。为此,您必须致电r1.perimeter()

    本质上,当你定义一个类的方法时,一个指向对象的指针this 会随之传递,以便编译器知道你指的是哪个特定的 Rectangle 实例。

    另一方面,如果您真的想用Rectangle.perimeter() 调用一个方法,那么您将指的是一个对每个 矩形都相同的方法。例如,您可以创建一个名为getNumSides() 的方法,其中无论矩形如何,值都将始终相同。为此,您必须使用static 声明它,这意味着在调用该方法时不再传递this 指针。该方法将使用public static int getNumSides() 声明并使用Rectangle.getNumSides() 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      相关资源
      最近更新 更多