黑马程序员技术交流社区

标题: 静态修饰的问题 [打印本页]

作者: 落星追恒    时间: 2016-1-15 22:49
标题: 静态修饰的问题
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);
}
}

这段代码执行结果为啥是麦克…韩国    红杉…韩国
静态修饰的不是中国吗?为啥可以被改变?
作者: tujiu888    时间: 2016-1-16 00:34
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, 下载次数: 25)

图解.png

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

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

静态区为共享区 之所以是日本,因为对象没有创建之前 他就在那儿了 ,对象可以直接调用,后面创建对象分别对其作出了更改  看方法执行的先后顺序呢
作者: 洋葱头头    时间: 2016-1-17 17:46
简单点  因为静态是所有对象共享的 你P2改了 其实p1调用的时候就是改掉的
作者: wooh24    时间: 2016-7-6 22:06
谢谢分享,看了,又请教了下别人,加深了理解.感恩
作者: sgnx    时间: 2016-7-6 22:15
静态成员的特点:随着类的加载而加载,优先于对象而存在,是共享资源,可以用类名进行调用;而这里考的是第三点
作者: Vision-V    时间: 2016-7-6 23:19
这个点我自己理解了,但是没有这么透彻,学习了
作者: yang11059307771    时间: 2016-7-6 23:44
学习了!!!!!!




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