当前位置: 首页 > 知识库问答 >
问题:

“static”关键字在类中起什么作用?

司徒焕
2023-03-14

具体来说,我正在尝试这个代码:

package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

但它给出了错误

无法访问静态方法main中的非静态字段

所以我把clock的声明改为:

static Clock clock = new Clock();

它起作用了。把这个关键字放在声明之前意味着什么?它到底会对这个对象做什么和/或限制什么?

共有3个答案

谭向晨
2023-03-14

static关键字意味着某些东西(字段、方法或嵌套类)与类型相关,而不是与该类型的任何特定实例相关。例如,我们调用数学。罪(…)没有Math类的任何实例,实际上您无法创建Math类的实例。

有关更多信息,请参阅Oracle Java教程的相关部分。

旁注

不幸的是,Java允许您像访问实例成员一样访问静态成员,例如。

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

这使它看起来好像sleep是一个实例方法,但实际上它是一个静态方法——它总是让当前线程处于睡眠状态。更好的做法是在调用代码中明确这一点:

// Clearer
Thread.sleep(5000);
咸育
2023-03-14

它意味着Hello中只有一个“时钟”的实例,而不是“Hello”类的每个独立实例都有一个,或者更多——所以,它意味着在“Hello”类的所有实例中会有一个共同共享的“时钟”引用。

因此,如果您要在代码中的任何地方做一个“新的你好”:在第一个场景中(在更改之前,不使用“静态”),它会在每次调用“新的你好”时创建一个新的时钟,但是在第二个场景中(在更改之后,使用“静态”),每个“新的你好”实例仍然会共享和使用最初创建的相同的“时钟”引用。

除非你需要在main之外的某个地方使用“时钟”,否则这同样适用:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}
劳华灿
2023-03-14

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关键字?如果方法基于某些参数执行功能,并且不需要访问非静态字段,那么您是否不总是希望这些类型的方法都是静态的? 问题答案: 您 可能 不希望它为静态的一个原因是允许它在子类中被覆盖。换句话说,行为可能不取决于对象内的数据,而是取决于对象的确切类型。例如,您可能具有常规的集合类型,其属性将在始终可变的集合,始终不可变的集合中返回,并依赖