黑马程序员技术交流社区
标题:
看程序,说出结果,以及得到结果的思路
[打印本页]
作者:
jiapengtao
时间:
2016-3-29 11:50
标题:
看程序,说出结果,以及得到结果的思路
class Demo {
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);
}
}
作者:
ping3014
时间:
2016-3-29 11:50
Person p1 = new Person();
// name = null;
// country = "中国";
p1.name = "麦克";
//name = "麦克";
p1.country = "美国";
// country = "美国";
------country用static修饰相当于“全局变量”(java没有全局变量,我打个比方),
------也就是这个变量不是p1或者p2这对象特有的,他是所有函数共享的
------类中初始化为
"中国",现在赋值
"美国",就覆盖掉
"中国"的值了
-------如果这时候打印
p1.country,
显示是
"美国"
Person p2 = new Person();
// name = null;
// country = "美国"; -------没有对country赋值过,所以还是"美国"
p2.name = "红杉";
//name = "红杉";
p2.country = "韩国";
//country = "韩国"; -----对country赋值"韩国",p1看到的也是"韩国"
p1.speak();
p2.speak();
麦克...韩国
红杉...韩国
作者:
15281616180
时间:
2016-3-29 13:00
结果当然是:麦克+中国,红杉+中国啦
作者:
15281616180
时间:
2016-3-29 13:04
15281616180 发表于 2016-3-29 13:00
结果当然是:麦克+中国,红杉+中国啦
Sorry,刚起床眼花了
应该都是韩国
国籍用static修饰了,每一次修改,那么Person的每一个对象都会国籍以最后的值为准
如果麦克+美国之后,红杉不修改国籍为韩国,那么红杉也是美国国籍了
作者:
沿途的风景
时间:
2016-3-29 13:40
麦克 韩国 红杉 韩国
country 是静态的,是共享数据
作者:
千年白狐
时间:
2016-3-29 16:06
本帖最后由 千年白狐 于 2016-3-29 16:11 编辑
输出结果:麦克 韩国,红杉,韩国 ,因为country是全局静态变量,最后修改的值为准,但是static后面加上final国籍都是中国了
作者:
zhangtaocg
时间:
2016-3-29 22:01
麦克 中国 红杉 中国 因为静态随类的加载而加载。。。
作者:
zx7750462
时间:
2016-3-29 22:17
6楼正解
作者:
xingxiansheng
时间:
2016-3-29 22:24
Static 最大特点是被其他对象所共享,也是可以改变的
作者:
柳春华
时间:
2016-3-29 23:47
15281616180 发表于 2016-3-29 13:00
结果当然是:麦克+中国,红杉+中国啦
麦克+韩国,红杉+韩国;
1,因为当你new p1.country的时候他就会访问静态方法区,去覆盖掉(中国).生成是(美国)
2.当你new p2.country的时候他就会访问静态方法区,去覆盖掉(美国).生成是(韩国).
不信可以变换位置检测下.谢谢{:2_30:}
作者:
伊乐杰
时间:
2016-3-29 23:59
麦克...韩国 红杉...韩国
作者:
陈月华
时间:
2016-3-30 00:15
11楼
麦克...韩国 红杉...韩国
作者:
李永昌
时间:
2016-3-30 00:20
麦克...韩国
红杉...韩国
作者:
Ak-47
时间:
2016-3-30 01:21
static 静态修饰符,静态变量存储在方法区的静态区中,随着类的加载而加载,优先于对象存在,被类的所有成员共享,通过创建两个不同的对象,但是他们的country都保存在一个地方,先后两次给它赋值,那最后静态区保存的就是最后赋值的,然后输出答应出来,那国家当然都是最后赋值的啊,因为这是大家类中所有成员共享的,而且你没有设置set方法,对象可以直接修改那个值
作者:
cohle1992
时间:
2016-3-30 10:54
麦克+韩国,红杉+韩国
作者:
lalala1a
时间:
2016-3-30 11:34
麦克...韩国 红杉...韩国
因为最后给country静态变量的是韩国
作者:
a292723685
时间:
2016-3-30 13:12
麦克...韩国
红杉...韩国
country是一个静态成员变量
他不在p1和p2的对象中,其和类一起加载在方法区
p2给其赋值为"韩国"的时候,是在方法区改变成了"韩国"
无论是p1还是p2调用"counry"成员
其结果都是韩国
.....
作者:
小灰辉
时间:
2016-3-30 17:17
class Demo {
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);
}
}
Person 类中 默认初始化值 null 中国 ,所以输出语句中打印的是 null 和 中国
主方法 创建p1对象 ,对name 进行赋值 name=麦克 ,country 虽然是静态的,但是也可以覆盖,country==美国;
然后主方法创建p2 对象,对name 进行赋值 name=红杉 ,country覆盖 country =韩国;
在主方法调用 p1.speak();时,name 输入 麦克,但是 country是静态的,存在方法区中的静态区,是所有对象的共享数据
作者:
小灰辉
时间:
2016-3-30 17:20
所以 P1输出的 P2赋值后的country 值,也就是韩国
P1 = 麦克 韩国
P2 创建对象,name赋的值是 红杉 ,country 也就是韩国
作者:
小凡帅哥
时间:
2016-3-30 21:28
麦克,韩国 红衫,韩国,静态是所有对象共享,不是每个对象一份,而是所有对象共用一份,任何一个对象对静态的改变都影响其他对象对该变量使用
作者:
gaoduilaile
时间:
2016-3-30 23:16
麦克 韩国,
红杉,韩国
,因为country是静态变量,加载类时加载,但随后又重新赋值了,以最后赋值·的为准;
所以国际都是棒子
如果static后面加上final国籍都是共和国了
作者:
HXWANHC
时间:
2016-3-30 23:33
麦克...中国 ,红杉...中国 ,因为国家被定义为静态的,static修饰的不能被再次赋值,而且被static修饰的存在于方法区的常量池中,
作者:
jiapengtao
时间:
2016-3-31 13:38
谢谢大家 ,都回答的很好
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2