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个赞
static
Java中的关键字表示变量或函数在该类的所有实例之间共享,因为它属于类型,而不是实际的对象本身。
因此,如果您有一个变量:private static int i = 0;
并i++
在一个实例中递增it(),则更改将反映在所有实例中。i
在所有情况下现在都是1。
可以在不实例化对象的情况下使用静态方法。
添加回答
举报