'static'关键字在课堂上做了什么?
具体来说,我试着这个代码:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
但它给了错误
无法访问静态方法main中的非静态字段
所以我改变了这个clock
的声明:
static Clock clock = new Clock();
它的工作。 在声明之前放置该关键字意味着什么? 它究竟会做什么和/或限制哪些对象可以做什么?
static
成员属于该类而不是特定的实例。
这意味着即使创建了一百万个类的实例或者您不创建任何static
字段,也只有一个实例存在[1]。 它将被所有实例共享。
由于static
方法也不属于特定实例,因此它们不能引用实例成员(您如何知道要引用哪个实例Hello类?)。 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或线程的一个,但这不是重点。
这意味着在Hello中只有一个“时钟”实例,而不是每个“Hello”类的单独实例都有一个实例,或者更多 - 这意味着在所有实例中将有一个共同的“时钟”参考“你好”类。
因此,如果您要在代码中的任何地方执行“新Hello”:A-在第一种情况下(更改之前,不使用“静态”),每次调用“新Hello”时都会生成一个新时钟,但B-在第二种情况下(更改后,使用“静态”),每个“新Hello”实例仍将共享并使用首次创建的初始和相同“时钟”引用。
除非你需要在主要以外的某个地方使用“时钟”,否则这种方法同样适用:
package hello;
public class Hello
{
public static void main(String args[])
{
Clock clock=new Clock();
clock.sayTime();
}
}
static
关键字意味着某些东西(一个字段,方法或嵌套类)与类型相关,而不是类型的任何特定实例。 因此,例如,没有Math
类的任何实例就调用Math.sin(...)
,并且实际上不能创建Math
类的实例。
有关更多信息,请参阅Oracle Java教程的相关部分。
边注
不幸的是,Java允许你像静态成员一样访问静态成员,例如
// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);
这使得它看起来好像sleep
是一种实例方法,但它实际上是一种静态方法 - 它总是使当前线程休眠。 在调用代码中清楚说明这是更好的做法:
// Clearer
Thread.sleep(5000);
链接地址: http://www.djcxy.com/p/78809.html