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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭天龚 中级黑马   /  2013-7-15 12:27  /  1163 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭天龚 于 2013-7-16 09:12 编辑

  1. import java.util.*;
  2. class Person implements Comparable<Person>
  3. {
  4.         private String name;
  5.         private int age;
  6.         Person(String name,int age){
  7.                 this.name=name;
  8.                 this.age=age;
  9.         }
  10.         public int compareTo(Person p){
  11.                 int flag=new Integer(this.age).compareTo(new Integer(p.age));
  12.                 if (flag==0)
  13.                 {
  14.                         return this.name.compareTo(p.name);
  15.                 }
  16.                 return flag;
  17.         }
  18.         public String toString(){return this.name+"..."+this.age;}

  19. }

  20. class Test
  21. {
  22.         public static void main(String[] args)
  23.         {
  24.                 TreeSet<Person>ts=new TreeSet<Person>();
  25.                 ts.add(new Person("a",20));
  26.                 ts.add(new Person("b",21));
  27.                 ts.add(new Person("a",20));
  28.                 ts.add(new Person("c",20));
  29.                 System.out.println(ts);
  30.         }
  31. }
复制代码
上面这段代码编译和运行都是没有问题的,但是我有一个疑问就是int flag=new Integer(this.age).compareTo(new Integer(p.age));在这行中对象p为什么直接可以用p.age的方式来访问他的私有成员。
我做了一个测试

  1. class Person
  2. {
  3.         private String name;
  4.         Person(String name){
  5.                 this.name=name;
  6.         }
  7. }
  8. class Test2
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 Person p=new Person("guotiangong");
  13.                 System.out.println(p.name);
  14.         }
  15. }
复制代码
在这一行中System.out.println(p.name);通过P.name来访问私有成员,编译就会报错。说是不能访问他的私有成员。我要问的就是为什么int flag=new Integer(this.age).compareTo(new Integer(p.age));在这行中对象p可以用p.age的方式来访问他的私有成员。那位大神帮我解惑一下,谢谢!

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 很给力!

查看全部评分

3 个回复

倒序浏览
本帖最后由 longlangcx 于 2013-7-15 12:55 编辑

private的意义在于,private成员只能被本类对象访问,注意,是本类对象,而不是本对象。在本类方法中,可以直接操作private属性,既可以访问自己的,也可以访问别人的。比如equals方法或者LZ写的compareTo方法。

这样看起来好像是破坏了封装性,其实并没有,因为这个类是你设计的,访问其他同类对象private成员的方法也是你设计的,如果你不提供访问其他同类对象私有属性的方法就不会破坏封装,你这样设计了,说明你有这方面的需求,比如像equals或者compareTo这样的方法,要比较两个对象的私有属性,自然需要可以访问。

你写的这俩程序,上面的可以直接访问是因为访问代码写在本类当中,具有访问权限;下面的不可以访问是因为访问代码写在其他类当中,没有访问权限。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你看清你写的P.AGE在哪了么?PRIVATE将本类实现细节对外部隐藏,对内不隐藏,你在本类中自然可以调用
回复 使用道具 举报
longlangcx 发表于 2013-7-15 12:53
private的意义在于,private成员只能被本类对象访问,注意,是本类对象,而不是本对象。在本类方法中,可以 ...

谢谢你的解惑!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马