8

我是 JAVA 新手,我喜欢尝试并理解一切。

在 JAVA 中访问静态方法“hero.returnHp()”时,我有以下内容:

 hero Mike = new hero();

 Mike.returnHp();

程序运行良好,但我注意到 Eclipse 有一条警告说:“来自 hero 类型的静态方法应该以静态方式访问。” 当我接受自动修复时,它会更改“Mike.returnHp();” 到“hero.returnHp();”。

所以我有两个问题:

1)这样做有什么好处?

2)如果我创建了两个相同类型的对象,我将如何指定以静态方式访问时返回哪个对象?

谢谢!

4

5 回答 5

11

我首先想指出关键字 static 的含义。

静态变量每个类只存在一次——也就是说,如果您使用静态变量创建一个类,那么该类的所有实例都将共享该一个变量。此外,如果它是一个公共静态变量,那么任何人都可以访问该变量而无需先创建该类的实例——他们只需调用 Hero.staticVariableName;

静态方法/函数是无状态的。也就是说,它们仅对传递给方法/函数的参数提供的信息 (1) 或 (2) 在静态变量(如上所示)中提供的信息或 (3) 硬编码到方法/函数中的信息(例如,您创建一个静态函数来返回“hello”——然后“hello”被硬编码到函数中)。

Eclipse 之所以希望您以静态方式访问静态方法,是因为它让您和后续程序员看到您正在访问的方法是静态的(这有助于防止错误)。该函数将以您执行的任何一种方式运行,但正确的方法是以静态方式访问静态函数。请记住,如果您调用静态方法,无论您从哪个实例变量调用它(Tim.returnHp、Jim.returnHp、Mike.returnHp 等等),您都将从 hero 类调用相同的函数,您将看到完全相同的函数行为,无论您从谁那里称呼它。

如果您创建了两个相同类型的对象,那么您不能指定在以静态方式访问时返回哪个对象;静态函数/方法将引用整个 Hero 类。

你能解释一下你正在尝试做什么,以便我们可以提供更具体的反馈吗?returnHp() 很可能不应该是静态的。

那是“返回生命值”吗?如果是,那么您不希望它是静态的,因为英雄拥有的生命值数量是英雄状态的一部分,而静态方法是无状态的。(将状态想象为当前状态——活着、死亡、受伤、攻击、防御、上述的某种组合等)我建议进入 Hero 类并将 returnHp 更改为非静态方法。

现在……我知道你没有问,但我想给你一些建议:

类名(例如 Hero)应该大写。实例变量名称(如 mike)应为小写。这是一种广泛接受的命名约定,它将增加代码的可读性。

杰夫

于 2012-11-24T01:42:38.727 回答
3

方法static是属于类但不属于对象的方法。在上面的示例中,您创建了一个Mikeclass对象hero。该方法returnHp()static,并且属于hero类,而不是hero对象(例如Mike)。

当您static从对象引用方法时,您可能会收到 IDE 或编译器警告,因为它不应该与该对象相关联,而只能与它的类相关联。

根据方法名称,我猜它不应该是静态的。

class hero {
    private float hp;
    public float returnHp() { // Should NOT be "public static float ..."
        return hp;
    }
}

关于类成员的JavaDocsstatic也对s进行了简要讨论。你可能想检查一下。

于 2012-11-24T01:25:25.337 回答
1
  1. 它是 JVM 规范的一部分。
  2. 你不需要。静态方法在类的实例之间很常见,您的困惑源于认为它是实例方法。
于 2012-11-24T01:24:38.680 回答
1

静态方法完全独立于类的任何实例。

考虑这可行,并且不会导致 NullPointerException:

 hero Mike = null;

 Mike.returnHp();

(顺便说一下,类名应该以大写开头,变量名应该小写)。

这是另一个简洁的示例:作为静态方法,Thread.sleep即使您尝试在另一个线程实例上调用它,它也总是使当前线程休眠。

静态方法应该通过类名调用,而不是通过实例调用,否则会很混乱,主要是因为没有动态调度,因为静态方法不能在子类中被覆盖:

 hero Tim = new superhero(); // superhero extends hero

 Tim.returnHp();  // still calls the method in hero, not in superhero

您现在收到编译器警告,但很多人说这是一个设计错误,应该是一个错误

于 2012-11-24T01:28:17.777 回答
0

static 表示静态方式。使用静态的一个原因是您可以直接使用类访问它。这就是它的好处。这就是为什么 main 总是静态的。入口函数不需要先创建实例。其实如果你在谷歌搜索静态,并深入了解它。你会知道何时以及为什么使用静态。

于 2012-11-24T01:33:34.987 回答