【发布时间】:2015-03-19 16:29:12
【问题描述】:
给定下面的代码:
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 是关键字。
- 用于声明类的成员。
- 静态成员属于类。
- 实例变量不能在静态上下文中使用。
- 此关键字不能在静态上下文中使用。
- 无需创建对象即可访问静态成员。
- 当类加载到内存中时,静态变量就会生效。
- 此关键字只能用于访问实例成员。
- 此关键字用于访问同一类中的类成员。
感谢您的帮助。以下是修改后的代码:
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");
}
}
【问题讨论】:
-
您个人如何看待这个问题?
-
我对静态变量有点困惑。如果它是一个实例变量,那么就会创建新对象。因为字符串是不可变的。
-
请记住:
s不是 String 对象的实例 - 它是一个变量。在 Java 中,变量是对对象实例的引用,而不是实例本身。"123"是一个字符串字面量,它代表一个 String 对象的实例。s="123"将引用s设置为指向包含字符 1,2 和 3 的字符串实例。
标签: java memory-management static static-methods static-members