static关键字是否阻止将新对象分配给变量?

时间:2015-03-19 16:29:12

标签: java memory-management static static-methods static-members

鉴于以下代码:

class Demo {                    
    static String s = "123";    

    static void m1(String s) {
        this.s = s;             
    }

    void m2(String s) {
        this.s = s;              
    }
}

class Hello {
    public static void main(String args) {
        Demo.m1("456");          
        Demo d = new Demo();       
        d.m2("789");         
    }
 }

我想知道使用实例变量和关于对象创建的静态变量有什么区别:

  1. 鉴于字符串是不可变的而变量s是静态的,为变量s创建了多少个对象?

  2. 调用m1()等静态方法时是否创建了新对象?

  3. 调用m2()等实例方法时是否创建了新对象?


  4. 编辑:

    我对静态关键字有一个错误的假设。现在我很清楚。

    1. static是一个关键字。
    2. 用于声明类的成员。
    3. 静态成员属于班级。
    4. 实例变量不能在静态上下文中使用。
    5. 此关键字不能在静态上下文中使用。
    6. 可以在不创建对象的情况下访问静态成员。
    7. 当类加载到内存中时,静态变量就会生效。
    8. 此关键字只能用于访问实例成员。
    9. 此关键字用于访问同一类中的类成员。
    10. 感谢您的帮助。以下是经过编辑的代码:

      class Demo {                    
          static String s= "123";  //Static variable
          String s1 ="abc"; // Instance variable  
      
          static void m1(String s) {
              Demo.s = s; //Accessing an static variable       
          }
      
          void m2(String s,String s1) {
              Demo.s = s; 
              this.s1 = s1;//Accessing an instance variable           
          }
      }
      
      class Hello {
          public static void main(String args[]) {
              Demo.m1("456");          
              Demo d = new Demo();       
              d.m2("789","xyz");         
          }
      }
      

2 个答案:

答案 0 :(得分:4)

static修饰符只表示变量是类的成员,而不是特定实例的成员。它与是否正在创建新对象无关。

首先对您的代码进行一些观察:

方法m1()

static void m1(String s) {
    this.s = s;
}

这将无法编译,因为您无法从静态方法引用实例变量。它应该是:

static void m1(String s) {
    Demo.s = s;
}

方法m2()

void m2(String s) {
    this.s = s;
}

现在这不会给你一个编译错误,但应该给你一个警告。 this仅应用于实例属性和方法。由于s是一个类属性,因此您应该使用该类的名称:

void m2(String s) {
    Demo.s = s;
}

现在我们可以推断代码:

  1. 执行static String s = "123"后,您需要创建一个新的String并指向s,所以s -> "123"

  2. 当您致电Demo.m1("456")时,此次创建另一个String"456",并s指向它,s -> "456"

  3. 当您致电d.m2("789")时,再次创建一个String对象"789",并使s指向它,s -> "789"

  4. 因此,您总共创建了3个String个对象。

答案 1 :(得分:0)

只创建了一个静态字符串(这是静态背后的基本思想)。因此,通过调用Demo.m1(" 353"),您将s更改为" 353"通过创建一个新的演示d,并调用d.m2(" 344"),你将覆盖内容" 353"用" 344"。

我对这个问题感到有点困惑,因为你可以使用

轻松地自己测试它
public void talk(){
    System.out.println("my static string s is: "+s)
}

并在程序的不同阶段打印s。你想知道为什么会发生这种事吗?

这可能对您有所帮助: Immutability of Strings in Java