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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 余清兰 于 2012-6-14 13:43 编辑

lisi和zhangsan都有相同国籍,我不想给p和p1两个对象的成员变量都赋值”cn”,这样比较浪费内存资源,这时我想用static来让”cn”这个数据共享,就不用在堆内存的两个对象中都有成员变量cn,我写了下面代码,确实达到了输出时lisi和zhangsan的国籍都是cn的功效,但是这个功劳到底是static的还是this实现的呢?如果是this实现的,那我怎么改成让static实现,并且和this结合一起使用让代码写得更有意义呢?求详解,原理越深越细越好。
  1. class Person
  2. {
  3. private String name;//成员变量(实例变量)
  4. static private String country;//静态的成员变量(类变量)
  5. Person(String name)
  6. {
  7. this.country="cn";
  8. this.name=name;
  9. System.out.println(name+":"+country);
  10. }
  11. }
  12. class PersonDemo
  13. {
  14. public static void main(String[] args)
  15. {
  16. Person p = new Person("lisi");
  17. Person p1 = new Person("zhangsan");
  18. }

  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
this 是指向当前对象的引用,他相当于对象。。。
static 是类的属性。。。。。。。static方法属于静态方法,静态方法中不存在当前对象,因而不能使用this。
所以static方法里面不能使用this~~~

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
胡大强 发表于 2012-6-14 10:53
this 是指向当前对象的引用,他相当于对象。。。
static 是类的属性。。。。。。。static方法属于静态方法 ...

嗯知道了,一个先来后到的关系
回复 使用道具 举报
static定义的成员变量在内存中只有一份,你在构造方法中定义了this.country="cn";那么在第一次new对象的时候,构造方法会调用,给country赋值cn,第二次又会调用还是给country赋值cn。所以其实你不用这么写。
class Person{
        private String name;//成员变量(实例变量)
        static private String country="cn";//静态的成员变量(类变量)
        Person(String name){
        this.name=name;
        System.out.println(name+":"+country);
        }
}
回复 使用道具 举报
方法需要引用调用它的对象时,可使用this .当方法的形式参数和实例变量同名时,this 还能实现对实例变量的隐藏.如对name的引用。普通成员要对象才能访问,如果我们希望类成员独,static 可实现。当成员被定义为static 时在创建类的时候它已经存在,任何对象创建之前就可以被济问的,同时还可被类中的后来建立的对象访问。this 和super都是引用当前对象,所以静态中不可以出现。
回复 使用道具 举报
类变量(static修饰的变量)随着类的加载而存在于方法区中,实例变量(this所指的变量)随着对象的建立而存在于堆内存中。
静态是先存在的,对象是后存在的。
所以你用static修饰国籍,那么在类加载时方法区中就存在"cn"这个值。
我觉得static private String country;这种写法不对,访问修饰符应该在最前面。
而成员方法所属于对象,必须通过调用对象拿到,输出又写在成员方法中,对象只起到拿到数据的作用。
总之从内存角度讲,country的值是先于对象存在的
回复 使用道具 举报
柯玲 中级黑马 2012-6-14 12:15:27
7#
漏讲了,既然已经给country声明为static,为什么不直接赋值,非要到构造函数里面重新赋值,写这个static不就没有意义了么,不如直接声明为private String country,加个static纯属多此一举。建议这样 static String country="cn";构造函数里面就不要再赋值了。下面是我的优化代码:
  1. class Person{
  2. private String name;
  3. static String country="cn";
  4. Person(String name){
  5.    this.name=name;
  6.    System.out.println(name+":"+country);
  7. }
  8. }
  9. class PersonDemo{
  10.   public static void main(String[] args){
  11.      Person p=new Person("lisi");
  12.          Person p1=new Person("zhangsan");
  13.   }
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马