A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 落星追恒 中级黑马   /  2016-1-15 22:49  /  1303 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
}
}

这段代码执行结果为啥是麦克…韩国    红杉…韩国
静态修饰的不是中国吗?为啥可以被改变?

11 个回复

倒序浏览
class  Demo {
public static void main(String[] args) {
                Person p3 = new Person();
                p3.name = "八嘎";
                p3.speak();
                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);
        }
}
通过图解 然后再通过我这段代码 希望你能很好的理解! 注意区分 static 和private的区别

图解.png (108.69 KB, 下载次数: 18)

图解.png

评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1

查看全部评分

回复 使用道具 举报
顶!!!!!!
回复 使用道具 举报
这块刚好是我不懂的
回复 使用道具 举报
static方法 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。  static变量 static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。  static代码块 static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。
回复 使用道具 举报
tujiu888 发表于 2016-1-16 00:34
class  Demo {
public static void main(String[] args) {
                Person p3 = new Person();

回答太认真了 非常感谢,我大概理解了你发的图片,静态变量被所有对象共享,在内存只有一个副本,所以在静态区被重复赋值之后结果仍然只有最后赋值的那一个。你前面发的那个代码我运行结果是巴嘎日本 麦克中国 红杉中国,后两个好理解跟我的提问一样,前一个八嘎日本就有些疑惑,为什么不是八嘎中国,是因为创建了新的对象以后就会有新的静态变量出现吗,不会替代原来那个? 但是又好像一直在创建对象,只是调用speak的位置有了区别。
回复 使用道具 举报
落星追恒 发表于 2016-1-16 23:57
回答太认真了 非常感谢,我大概理解了你发的图片,静态变量被所有对象共享,在内存只有一个副本,所以在 ...

静态区为共享区 之所以是日本,因为对象没有创建之前 他就在那儿了 ,对象可以直接调用,后面创建对象分别对其作出了更改  看方法执行的先后顺序呢
回复 使用道具 举报
简单点  因为静态是所有对象共享的 你P2改了 其实p1调用的时候就是改掉的
回复 使用道具 举报
谢谢分享,看了,又请教了下别人,加深了理解.感恩
回复 使用道具 举报
静态成员的特点:随着类的加载而加载,优先于对象而存在,是共享资源,可以用类名进行调用;而这里考的是第三点
回复 使用道具 举报
这个点我自己理解了,但是没有这么透彻,学习了
回复 使用道具 举报
学习了!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马