给出以下代码:
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");
}
}
我想知道在对象创建方面使用实例变量和静态变量有什么区别:
鉴于字符串是不可变的并且变量 s 是静态的,为变量
s
创建了多少个对象?调用
m1()
等静态方法时是否会创建新对象?调用
m2()
等实例方法时是否会创建一个新对象?
编辑:
我对 static 关键字有一个错误的假设。现在我清楚了。
- static 是一个关键字。
- 用于声明类的成员。
- 静态成员属于类。
- 实例变量不能在静态上下文中使用。
- 此关键字不能在静态上下文中使用。
- 无需创建对象即可访问静态成员。
- 当类加载到内存中时,静态变量就会生效。
- 此关键字只能用于访问实例成员。
- 此关键字用于访问同一类中的类成员。
感谢您的帮助。以下是编辑后的代码:
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;
}
现在我们可以推理代码了:
当您执行
static String s = "123"
时,您创建了一个新的String
并让s
指向它,所以s ->“123”
。当您调用
Demo.m1("456")
时,您创建了另一个String
,这次是"456"
,并使s
指向它,因此s -> "456"
。当您调用
d.m2("789")
时,您会再次创建一个String
对象"789"
,并使s
指向它,因此s -> "789"
。
因此,您总共创建了 3 个 String
对象。
关于java - static 关键字是否会阻止将新对象分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150038/