在JAVA中访问静态方法 "hero.returnHp()" 时,我遇到了以下问题:
hero Mike = new hero();
Mike.returnHp();
程序运行良好,但我注意到Eclipse有一个警告:“应以静态方式访问类型英雄的静态方法。”当我接受自动修复时,它将“Mike.returnHp();”更改为“hero.returnHp();”。
所以我有两个问题:
1)这有什么优势?
2)如果我创建了两个相同类型的对象,如何指定在静态方式下访问时返回哪一个?
谢谢!
hero Mike = new hero();
Mike.returnHp();
首先,我想指出关键字“静态”(static)的含义。
静态变量只存在于类中一次 - 也就是说,如果您创建了一个带有静态变量的类,那么该类的所有实例都将共享该变量。此外,如果它是公共静态变量,则任何人都可以访问该变量,而无需先创建该类的实例 - 他们只需调用Hero.staticVariableName;
静态方法/函数是无状态的。也就是说,它们只处理(1)由传递给方法/函数的参数提供的信息,或者(2)在静态变量中(如上所述),或者(3)硬编码到方法/函数中的信息(例如,您创建了一个静态函数返回“ hello” - 然后“ hello”被硬编码到函数中)。
Eclipse要求您以静态方式访问静态方法的原因是它可以让您和后续的程序员看到您正在访问的方法是静态的(这有助于防止错误)。无论您怎么做,函数都会运行,但正确的方法是以静态方式访问静态函数。请记住,如果您调用静态方法,则无论从哪个实例变量调用它(Tim.returnHp,Jim.returnHp,Mike.returnHp等),您都将从英雄类中调用相同的函数,并且无论您从谁那里调用它,您将看到完全相同的行为。
如果您创建了两个相同类型的对象,则无法指定在以静态方式访问时要返回哪个对象;静态函数/方法将引用整个Hero类。
您能解释一下您试图做什么,以便我们可以提供更具体的反馈吗?很可能returnHp()不应该是静态的。
那是“返回生命值”吗?如果是,那么您不希望它是静态的,因为英雄拥有的生命值数量是英雄状态的一部分,而静态方法是无状态的。(把状态想象成当前状态 - 活着,死亡,受伤,攻击,防御,以上几种状态的某些组合等)我建议进入Hero类并将returnHp更改为非静态方法。
现在... 我知道你没有询问,但我想建议你一些内容:
类名(例如Hero)应大写。实例变量名(例如mike)应小写。这是一种广泛接受的命名约定,它将增加您的代码的可读性。
Jeff
hero
类的对象Mike
。方法returnHp()
是static
的,并且属于hero
类,而不是hero
对象(如Mike
)。static
方法时,您可能会收到IDE或编译器警告,因为它永远不应该与该对象绑定,只能与其类绑定。class hero {
private float hp;
public float returnHp() { // Should NOT be "public static float ..."
return hp;
}
}
关于类成员的JavaDocs文档也简要介绍了static
关键字,你可能需要查看。
静态方法完全独立于类的任何实例。
考虑到这一点,它可以正常工作,而不会导致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
你现在收到了一个编译器 警告,但很多人认为这是一个设计错误,应该是一个错误。
static 意味着一种静态的方式。使用 static 的一个原因是可以直接使用类来访问它。这是它的好处。这就是为什么 main 函数总是静态的原因。入口函数不需要先创建实例。 实际上,如果你在谷歌中搜索 static,并深入了解它,你就会知道何时以及为什么使用 static。
Mike.returnHp();
更改为hero.returnHp();
嗯,我想应该是反过来的。 - leonbloy