黑马程序员技术交流社区

标题: 为什么是这样的结果 [打印本页]

作者: luojian    时间: 2016-4-10 13:07
标题: 为什么是这样的结果
public static void main(String[] args) {
Person p1 = new Person();   
p1.name = “麦克”;        
p1.country = "美国";        
Person p2 = new Person();
p2.name = "红杉";        
p2.country = "韩国";   
p1.speak();
p2.speak();
}
}
class Person {
String name;                    
static String country  =  "中国";                    
public void speak() {            
System.out.println(name + "..." + country);
}
}
作者: grandsun    时间: 2016-4-10 13:55
本帖最后由 grandsun 于 2016-4-10 14:06 编辑

static String country  =  "中国";  
改成String country  =  "中国";  
不然因为country是被static修饰的.所以一次赋值,就会同时被多个对象使用
而且不会随着对象的增多而增多.始终只有一个country的成员变量.
另外static的正确调用方式应该是用类名.也就是这样:Person.country
你第一次改成"美国",就算p2的country不再赋值,也会自动变成"美国"..
如果p2的country也赋值的话,会把之前的"美国给覆盖掉"
所以如果你想要不断改变,并且有不同的country的值.就要把static修饰符去掉.

作者: 65708535    时间: 2016-4-10 14:55
楼上正解,静态修饰符修饰的原因
作者: H_shaohui    时间: 2016-4-10 15:46
因为static修饰的成员变量有“共用”的意思,就是说被创建一次后,后面的调用都会共用这一个变量,如果前面有改变,就会全部覆盖为改变后的值。楼上的解释已经说得很明白了
作者: IT小笨鸟    时间: 2016-4-10 15:57
static修饰的成员变量会随着类的加载而加载,并且只有一个
作者: 丶半度微凉    时间: 2016-4-10 16:25
static修饰的成员变量是共享的
作者: ttkuaile    时间: 2016-4-10 16:29
静态修饰符
作者: 哦哈哟    时间: 2016-4-10 17:18
静态成员和静态方法只有方法区中,不是存在堆内存当中的,是被所有的对象共用的,所以你修改country只是修改了方法区中country,而堆内存引用的对象没有country属性。相对name就再堆内存中,name所修改的是this.name,this指的是name所属的对象。
作者: 董改名    时间: 2016-4-10 19:25
学到了static的一个知识点
作者: forplay    时间: 2016-4-10 19:36
楼上都解释的很清楚了。
作者: qing31657552    时间: 2016-4-10 22:49
楼上正解,把static 去了吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2