为了账号安全,请及时绑定邮箱和手机立即绑定

'static'关键字在一个类中做什么?

'static'关键字在一个类中做什么?

qq_笑_17 2019-05-25 14:43:38
'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();它奏效了。在声明之前放置该关键字是什么意思?对于该对象可以做什么,它究竟会做什么和/或限制什么?
查看完整描述

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或线程一个,但这不是重点。


查看完整回答
反对 回复 2019-05-25
?
杨__羊羊

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();    
    }}


查看完整回答
反对 回复 2019-05-25
?
Helenr

TA贡献1780条经验 获得超4个赞

static关键字是指某物(字段,方法或嵌套类)是相关于类型,而不是任何特定的实例的类型。因此,例如,一个调用Math.sin(...)没有Math该类的任何实例,实际上您无法创建Math该类的实例。

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


边注

遗憾的是 Java 允许您像访问实例成员一样访问静态成员,例如

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

这使它看起来好像sleep是一个实例方法,但它实际上是一个静态方法 - 它总是使当前线程休眠。最好在调用代码中明确这一点:

// ClearerThread.sleep(5000);


查看完整回答
反对 回复 2019-05-25
?
慕村225694

TA贡献1880条经验 获得超4个赞

staticJava中的关键字表示变量或函数在该类的所有实例之间共享,因为它属于类型,而不是实际的对象本身。

因此,如果您有一个变量:private static int i = 0;i++在一个实例中递增it(),则更改将反映在所有实例中。i在所有情况下现在都是1。

可以在不实例化对象的情况下使用静态方法。


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 444 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号