gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:16:36 25 4
gpt4 key购买 nike

给出以下代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com