我是JAVA的新手,我喜欢尝试理解一切。
在JAVA中访问静态方法“hero.returnHp()”时,我有以下内容:
hero Mike = new hero();
Mike.returnHp();
该程序运行正常,但我注意到Eclipse有一个警告声明,“类型英雄的静态方法应该以静态方式访问。”当我接受自动修复时,它会改变“Mike.returnHp();” to“hero.returnHp();”。
所以我有两个问题:
1)这有什么好处?
2)如果我创建了两个相同类型的对象,那么在以静态方式访问时如何指定返回哪个对象?
谢谢!
答案 0 :(得分:10)
我首先要指出关键字static的含义。
静态变量每个类只存在一次 - 也就是说,如果您使用静态变量创建一个类,那么该类的所有实例将共享该一个变量。此外,如果它是一个公共静态变量,那么任何人都可以访问该变量而无需首先创建该类的实例 - 他们只需调用Hero.staticVariableName;
静态方法/功能是无状态的。也就是说,它们仅作用于传递给方法/函数的参数提供的信息(1),或者(2)静态变量(上面命名),或者(3)硬编码到方法/函数中(例如,创建一个静态函数以返回“hello” - 然后将“hello”硬编码到函数中。
Eclipse希望您以静态方式访问静态方法的原因是因为它允许您和后续程序员看到您正在访问的方法是静态的(这有助于防止错误)。该函数将以您执行的任一方式运行,但正确的方法是以静态方式访问静态函数。请记住,如果你调用一个静态方法,无论你从哪个实例变量调用它(Tim.returnHp,Jim.returnHp,Mike.returnHp,等等),你都会从英雄类中调用相同的函数,你会看到完全相同的行为,不管你从谁那里打电话。
如果您创建了两个相同类型的对象,那么您可能无法指定在以静态方式访问时要返回的对象;静态函数/方法将引用整个Hero类。
您能解释一下您正在尝试做些什么,以便我们能够提供更具体的反馈吗? returnHp()很可能不是静态的。
那是“回归生命值”吗?如果是,那么你不希望它是静态的,因为英雄拥有的生命值的数量是英雄状态的一部分,静态方法是无状态的。 (想想状态就像现在的情况 - 活着,死了,受伤,攻击,防守,前面提到的一些组合等等)我建议进入Hero类并将returnHp改为非静态方法。
现在......我知道你没有问,但我想告诉你一些事情:
类名(例如Hero)应该大写。实例变量名称(例如mike)应为小写。这是一种广泛接受的命名约定,它将提高代码的可读性。
杰夫
答案 1 :(得分:3)
static
方法是属于类而不属于对象的方法。在上面的示例中,您创建了一个类Mike
的对象hero
。方法returnHp()
为static
,属于hero
类,而不属于hero
对象(例如Mike
)。
当您从对象引用static
方法时,您可能会收到IDE或编译器警告,因为它永远不会绑定到该对象,只能绑定到它的类。
根据方法名称,我猜它不应该是静态的。
class hero {
private float hp;
public float returnHp() { // Should NOT be "public static float ..."
return hp;
}
}
JavaDocs on class members也对static
进行了简短的讨论。你可能想检查一下。
答案 2 :(得分:1)
答案 3 :(得分: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
您现在正在获取编译器警告,但很多人说这是一个设计错误,应该是错误。
答案 4 :(得分:0)
静态意味着静态方式。使用static的一个原因是您可以直接使用类访问它。这是它的好处。这就是为什么main始终是静态的。入口函数不需要先创建实例。 实际上,如果你在谷歌搜索静态,并深入了解它。你会知道何时以及为何使用静电。