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

标签 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() 等实例方法时是否会创建一个新对象?

<小时/>

编辑:

我对 static 关键字有一个错误的假设。现在我清楚了。

  1. static 是一个关键字。
  2. 用于声明类的成员。
  3. 静态成员属于类。
  4. 实例变量不能在静态上下文中使用。
  5. 此关键字不能在静态上下文中使用。
  6. 无需创建对象即可访问静态成员。
  7. 当类加载到内存中时,静态变量就会生效。
  8. 此关键字只能用于访问实例成员。
  9. 此关键字用于访问同一类中的类成员。

感谢您的帮助。以下是编辑后的代码:

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

最佳答案

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"

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

关于java - static 关键字是否会阻止将新对象分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150038/

相关文章:

java - 如何分析简单的英语句子

Java HelloWorld 程序运行

Java内存清理

iphone - 使用 Objective C 监控有关 iPhone 运行进程的信息

连接到 rfcomm0 的 Java rxtx 代码不起作用

Java 8 - 使用 Comparator 以不同顺序比较多个字段

delphi - TInterfacedObject 自动内存管理也可以与 C++Builder 一起使用吗?

java - Tomcat+Spring环境下的Classloader之谜

c - 为什么在所有函数(main() 除外)之前都有一个 'static' 关键字?

c++ - 静态变量和全局变量什么时候初始化?