【问题标题】:Calling non-static methods from other classes [duplicate]从其他类调用非静态方法[重复]
【发布时间】:2013-01-12 02:32:24
【问题描述】:

我正在做我的任务,但遇到了一些错误。在一个类中,我有这种方法:

public class Class1{
    public static boolean winningRecord(){
        final int WINNING_RECORD;
        return Class2.getPoints() > WINNING_RECORD;
    }
}

class Class2{
    int wins = 0;
    public int getPoints(){
        return wins; //More to it but to keep it simple I'll leave that out
    }
}

现在我收到错误“无法从静态上下文引用非静态方法...”,因此我将 getPoints() 设为静态方法,也将变量设为静态,并且它可以工作。但是在另一种打印出 Objects 的方法中它不起作用(我相信这是因为 static 关键字)。

所以我的问题毕竟有没有一种方法可以在不创建第二个类的实例的情况下调用方法?这是我的一般想法代码,它应该让您了解发生了什么,如果没有,我会添加更多内容。

【问题讨论】:

  • getPoints 不能是静态的,除非 wins 是静态的。如果wins 是静态的,那么整个应用程序将只共享一个wins 的副本。您需要决定需要多少份wins。 (而且“除了单例,拥有一个只用于存储一个静态数据值的类通常很愚蠢。)
  • 您需要详细说明“但是在另一种打印出 Objects 的方法中它不起作用(我相信这是因为 static 关键字)。”使 getPoints() 静态本身不应该是一个问题。
  • 我有另一种打印出对象的方法,但是当它打印出变量值时,它只是为每个对象输出相同的东西。
  • 你问的纯粹是对OOPS基础知识的理解。
  • Class2 有一个名为 wins 的实例变量。 getPoints() 返回该实例变量,如果您没有 Class2 的实例,那么静态调用该方法将毫无意义,因此您收到错误的原因。就像@JonSkeet 所说,熟悉static 的含义。它将获得丰厚的回报。

标签: java


【解决方案1】:

java 中的一个关键概念是实例化的概念。类定义具有一种对象类型的所有规则。对象的每个实例都将遵循相同的规则。例如,如果我定义

class Ball {
  public void bounce() { 
    // lots of code here
  }
}

然后系统有代码Balls 可以bounce

如果我想要两个球...

public class Main {
  public static void main(String args[]) {
    Ball beachBall = new Ball();
    Ball soccerBall = new Ball();

我可以随心所欲地弹跳它们

    beachBall.bounce();
    beachBall.bounce();
    soccerBall.bounce();
    beachBall.bounce();

但我不能说

    Ball.bounce();

因为这会让我的系统产生“哪个球?”的问题

static 方法和变量与特定实例无关。

例如:

class Werewolf {
  static boolean fullMoon = false;

  static void setFullMoon(boolean isVisible) {
    fullMoon = isVisible;
    // code code code
  }

  void eatPerson(Person p) {
    // code code code
  }
}

应用于所有狼人的静态方法,因此在类上调用:

Werewolf.fullMoon(true);

应用于特定狼人的非静态(实例)方法,因此在实例上调用。

jeff.eatPerson(chuck);

杰夫是狼人。查克是他吃的人。 尽量忽略残酷的cmets。我们都从某个地方开始。

【讨论】:

    【解决方案2】:

    在您的代码中,winningRecord() 特定于类 Class1 本身,因为它是静态键操作。

    而 Class2 中的 getPoints() 特定于类 Class2 的实例

    无法从静态上下文访问非静态方法。

    【讨论】:

      【解决方案3】:

      getPoints 不能是静态的,除非 wins 是静态的。如果wins 是静态的,那么只有一个wins 副本,由整个应用程序共享。你需要决定你需要多少份胜利。 (而且“除了单例,拥有一个只用于存储一个类的类通常很愚蠢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        相关资源
        最近更新 更多