黑马程序员技术交流社区

标题: 看程序,说出结果,以及得到结果的思路 [打印本页]

作者: 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