鉴于以下代码:
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()
等实例方法时是否创建了新对象?
编辑:
我对静态关键字有一个错误的假设。现在我很清楚。
感谢您的帮助。以下是经过编辑的代码:
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");
}
}
答案 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;
}
现在我们可以推断代码:
执行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
个对象。
答案 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