4 回答
TA贡献1825条经验 获得超6个赞
static 成员属于类而不是特定实例。
这意味着即使您创建了一百万个类的实例,或者您没有创建任何一个实例,static也只存在一个字段的实例[1]。它将由所有实例共享。
由于static方法也不属于特定实例,因此它们不能引用实例成员。在给出的示例中,main不知道它应该引用Hello哪个Clock类的实例(以及它的哪个实例)。static会员只能参考static会员。实例成员当然可以访问static成员。
附注:当然,static成员可以通过对象引用访问实例成员。
例:
public class Example {
private static boolean staticField;
private boolean instanceField;
public static void main(String[] args) {
// a static method can access static fields
staticField = true;
// a static method can access instance fields through an object reference
Example instance = new Example();
instance.instanceField = true;
}[1]:根据运行时特性,它可以是每个ClassLoader或AppDomain或线程一个,但这不是重点。
TA贡献1943条经验 获得超7个赞
这意味着Hello中只有一个“clock”实例,而不是“Hello”类的每个单独实例中的一个实例,或者更多 - 这意味着在所有实例中都会有一个共同的“时钟”引用。 “Hello”课程。
所以,如果你要在你的代码中的任何地方做一个“新的Hello”:A-在第一个场景中(在更改之前,不使用“static”),每次调用“new Hello”时它会生成一个新的时钟,但是在第二个场景中B-(在更改之后,使用“静态”),每个“新的Hello”实例仍将共享并使用首先创建的初始和相同的“时钟”引用。
除非你在main之外的某个地方需要“时钟”,否则这也会起作用:
package hello;public class Hello{
public static void main(String args[])
{
Clock clock=new Clock();
clock.sayTime();
}}TA贡献1780条经验 获得超4个赞
该static关键字是指某物(字段,方法或嵌套类)是相关于类型,而不是任何特定的实例的类型。因此,例如,一个调用Math.sin(...)没有Math该类的任何实例,实际上您无法创建Math该类的实例。
有关更多信息,请参阅Oracle Java教程的相关部分。
边注
遗憾的是, Java 允许您像访问实例成员一样访问静态成员,例如
// Bad code!Thread.currentThread().sleep(5000);someOtherThread.sleep(5000);
这使它看起来好像sleep是一个实例方法,但它实际上是一个静态方法 - 它总是使当前线程休眠。最好在调用代码中明确这一点:
// ClearerThread.sleep(5000);
TA贡献1880条经验 获得超4个赞
staticJava中的关键字表示变量或函数在该类的所有实例之间共享,因为它属于类型,而不是实际的对象本身。
因此,如果您有一个变量:private static int i = 0;并i++在一个实例中递增it(),则更改将反映在所有实例中。i在所有情况下现在都是1。
可以在不实例化对象的情况下使用静态方法。
添加回答
举报
