具体来说,我正在尝试这个代码:
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
关键字意味着某些东西(字段、方法或嵌套类)与类型相关,而不是与该类型的任何特定实例相关。例如,我们调用数学。罪(…)
没有Math
类的任何实例,实际上您无法创建Math
类的实例。
有关更多信息,请参阅Oracle Java教程的相关部分。
旁注
不幸的是,Java允许您像访问实例成员一样访问静态成员,例如。
// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);
这使它看起来好像sleep
是一个实例方法,但实际上它是一个静态方法——它总是让当前线程处于睡眠状态。更好的做法是在调用代码中明确这一点:
// Clearer
Thread.sleep(5000);
它意味着Hello中只有一个“时钟”的实例,而不是“Hello”类的每个独立实例都有一个,或者更多——所以,它意味着在“Hello”类的所有实例中会有一个共同共享的“时钟”引用。
因此,如果您要在代码中的任何地方做一个“新的你好”:在第一个场景中(在更改之前,不使用“静态”),它会在每次调用“新的你好”时创建一个新的时钟,但是在第二个场景中(在更改之后,使用“静态”),每个“新的你好”实例仍然会共享和使用最初创建的相同的“时钟”引用。
除非你需要在main之外的某个地方使用“时钟”,否则这同样适用:
package hello;
public class Hello
{
public static void main(String args[])
{
Clock clock=new Clock();
clock.sayTime();
}
}
static
成员属于类而不是特定实例。
这意味着,静态字段只存在一个实例[1],即使您创建了一百万个类实例或没有创建任何实例。它将被所有实例共享。
由于static
方法也不属于特定实例,因此它们不能引用实例成员。在给出的示例中,main
不知道它应该引用Hello
类的哪个实例(以及Clock
类的哪个实例)<代码>静态成员只能引用静态
成员。实例成员当然可以访问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或线程一个,但这无关紧要。
我对“作为”关键词的用法感到困惑。 它是强制转换运算符还是别名运算符? 我在互联网上遇到了以下代码,看起来像一个演职人员: 这是什么意思?
本文向大家介绍C# 中static关键字的作用?相关面试题,主要包含被问及C# 中static关键字的作用?时的应答技巧和注意事项,需要的朋友参考一下 对类有意义的字段和方法使用static关键字修饰,称为静态成员,通过类名加访问操作符“.”进行访问; 对类的实例有意义的字段和方法不加static关键字,称为非静态成员或实例成员。 注: 静态字段在内存中只有一个拷贝,非静态字段则是在每个实例对象中
本文向大家介绍iOS static 关键字的作用?相关面试题,主要包含被问及iOS static 关键字的作用?时的应答技巧和注意事项,需要的朋友参考一下 (1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值; (2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; (
问题内容: 我从一开始就阅读Java教程,并且对字段或变量上的关键字有疑问。如这里所说: 类变量是使用static修饰符声明的任何字段;这告诉编译器,无论该类被实例化了多少次,该变量确实存在一个副本。可以将定义特定类型自行车的齿轮数的字段标记为静态,因为从概念上讲,相同数量的齿轮将应用于所有情况。 这样,我想如果您有一个对象(在这种情况下,该类是一个实例),并且在其中有一个字段,则与您是否喜欢or
问题内容: 我正在学习如何将sqlite3与python结合使用。我要遵循的教科书中的示例是一个数据库,其中每个“国家/地区”记录都有一个“地区”,“国家/地区”和“人口”。 这本书说: 以下代码段使用CONSTRAINT关键字来指定要创建的表中没有两个条目的地区和国家/地区具有相同的值: 请您在这里解释一下。如果我删除它,似乎仅PRIMARY KEY语句就可以确保每个国家/地区在该地区都有唯一的
问题内容: 什么时候不宜在方法签名上使用Java中的static关键字?如果方法基于某些参数执行功能,并且不需要访问非静态字段,那么您是否不总是希望这些类型的方法都是静态的? 问题答案: 您 可能 不希望它为静态的一个原因是允许它在子类中被覆盖。换句话说,行为可能不取决于对象内的数据,而是取决于对象的确切类型。例如,您可能具有常规的集合类型,其属性将在始终可变的集合,始终不可变的集合中返回,并依赖