具体来说,我是在尝试以下代码:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
但它给出了错误
无法访问静态方法main中的非静态字段
所以我改变了 clock
对此:
static Clock clock = new Clock();
而且成功了。在声明前加上关键字是什么意思?它究竟会对该对象做什么和/或限制什么?
21条答案
按热度按时间qoefvg9y16#
java中的静态:
static是非访问修饰符。static关键字属于类而不是类的示例。可用于将变量或方法附加到类。
static关键字可用于:
方法
变量
类嵌套在另一个类中
初始化块
不能用于:
类(非嵌套)
建造师
接口
方法本地内部类(与嵌套类不同)
内部类方法
示例变量
局部变量
例子:
假设以下示例中有一个名为count的示例变量,该变量在构造函数中递增:
输出:
1 1 1
由于示例变量在创建对象时获得内存,因此每个对象都将拥有示例变量的副本,如果它递增,则不会反映到其他对象。
现在,如果我们将示例变量count更改为静态变量,那么程序将产生不同的输出:
输出:
1 2 3
在这种情况下,静态变量只会获得一次内存,如果任何对象更改了静态变量的值,它将保留其值。
静态和最终:
声明为final和static的全局变量在整个执行过程中保持不变。因为,静态成员存储在类内存中,并且在整个执行过程中只加载一次。它们对于类的所有对象都是公共的。如果将静态变量声明为final,则任何对象都不能更改其值,因为它是final。因此,声明为final和static的变量有时称为常量。接口的所有字段都称为常量,因为默认情况下它们是最终的和静态的。
图片资源:最终静态
jckbn6z717#
静态意味着您不必创建类的示例来使用与类关联的方法或变量。在您的示例中,您可以调用:
直接,而不是:
从静态方法(属于类)内部,您不能访问任何非静态的成员,因为它们的值取决于类的示例化。作为示例成员的非静态时钟对象对hello类的每个示例都有不同的值/引用,因此您无法从类的静态部分访问它。
frebpwbc18#
静态成员的基本用法。。。
这就是如何在所有类成员中共享值,而不向其他类发送类示例hello的方法。在静态情况下,不需要创建类示例。
只需按类名调用静态值或方法:
d7v8vwbk19#
这个
static
java中的关键字表示变量或函数在该类的所有示例之间共享,因为它属于该类型,而不是实际对象本身。如果你有一个变量:
private static int i = 0;
然后你增加它(i++
)在一个示例中,更改将反映在所有示例中。i
现在在所有情况下都是1。静态方法可以在不示例化对象的情况下使用。
yhuiod9q20#
这个
static
关键字意味着某些内容(字段、方法或嵌套类)与类型相关,而不是与该类型的任何特定示例相关。例如,一个Math.sin(...)
没有任何Math
类,实际上您不能创建Math
班级。有关更多信息,请参阅oracle java教程的相关部分。
旁注
不幸的是,java允许您像访问示例成员一样访问静态成员。
看起来好像
sleep
是一个示例方法,但它实际上是一个静态方法-它总是使当前线程休眠。最好在调用代码中说明这一点:sz81bmfz21#
这意味着hello中只有一个“clock”示例,而不是每个单独的“hello”类示例都有一个,或者更多,这意味着在“hello”类的所有示例中都有一个共同共享的“clock”引用。
因此,如果您在代码中的任何位置执行“new hello”:a-在第一个场景中(在更改之前,不使用“static”),每次调用“new hello”时,它都会生成一个新的时钟,但是b-在第二个场景中(更改之后,使用“static”),每个“new hello”示例仍将共享和使用最初创建的初始和相同的“clock”引用。
除非你需要在main之外的某个地方使用“时钟”,否则这同样适用: