【问题标题】:Doesn't this defy the rules of static variables?这不违反静态变量的规则吗?
【发布时间】:2019-10-16 14:57:42
【问题描述】:

我已经声明了一个静态变量,并通过在 Initializer 块中调用它来通过非静态方法更改它的值,该块将在每次实例化对象时调用。为什么这不会给我运行时间或编译时间错误?

public class FinalKeyWord {

    final int age;
    static int name;

    {
        ran();
        displayName();
    }


    public FinalKeyWord() {
        this.age = 10;
    }

    public FinalKeyWord(int a){
        this.age = a;
    }

    void ran(){
        Random r = new Random();
        int rand = r.nextInt(6);
        System.out.println(rand);
        name = rand;
    }

    public void displayAge() {
        System.out.println("This is final " + age);
    }

    public void displayName() {
        System.out.println("This is static " + name);
    }

    public static void main(String[] args) {

        FinalKeyWord a = new FinalKeyWord();
        //a.displayAge();
        //a.displayName();
        FinalKeyWord a2 = new FinalKeyWord(35);
        //a2.displayName();

    }

}

输出:

    This is static 2 \n
    This is is static 3

【问题讨论】:

  • 但是为什么实例不能修改静态值??
  • 为什么你认为你不能从类的实例中访问静态字段?
  • “为什么这没有给我运行时间或编译时间错误?”。为什么要这样?
  • staticfinal 是两个独立的概念。你到底对什么感到困惑?

标签: java static-variables


【解决方案1】:

一个变量是静态的并不意味着你以后不能改变它的值,这意味着它在内存中为它所在的类的所有实例分配一次,所以每当你创建一个新对象时,它都会指向该变量在内存中的同一块与普通变量或实例变量不同,只要创建此类的新对象,就会为该变量保留一个新的内存块。

【讨论】:

    【解决方案2】:

    来自Java Documentation/Tutorials

    实例方法可以直接访问类变量和类方法。
    所以这是完全合法的,

    public class FinalKeyWord {
    
        static int a = 5;
    
        void change() {
            a= 10;
        }
    
        public static void main(String[] args) {
            FinalKeyWord obj = new FinalKeyWord();
            System.out.println(a);
            obj.change();
            System.out.println(a);
        }
    }
    

    并且会打印,

    5
    10
    

    【讨论】:

    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    相关资源
    最近更新 更多