static关键字在类中发挥什么作用?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:static关键字在类中发挥什么作用?

当我测试下方代码的时候:

package hello;

public class Hello {

    Clock clock = new Clock();

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

报了如下错误

Cannot access non-static field in static method main
复制代码

所以我把clock的声明改成了下面这样:

static Clock clock = new Clock();
复制代码

这样代码就运行成功了,在声明前面加上关键字到底有何意义?它会对对象产生什么影响呢?

回答一

静态成员的基本用法

public class Hello
{
    // value / method
    public static String staticValue;
    public String nonStaticValue;
}

class A
{
    Hello hello = new Hello();
    hello.staticValue = "abc";
    hello.nonStaticValue = "xyz";
}

class B
{
    Hello hello2 = new Hello(); // here staticValue = "abc"
    hello2.staticValue; // will have value of "abc"
    hello2.nonStaticValue; // will have value of null
}
复制代码

这就是如何在类的所有实例中共享值,而不用创建一个实例再去获得值。

Hello hello = new Hello();
hello.staticValue = "abc";
复制代码

你可以直接使用类名调用静态值

Hello.staticValue = "abc";
复制代码

回答二

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;
    }
复制代码

文章翻译自Stack Overflow:stackoverflow.com/questions/4…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享