黑马程序员技术交流社区

标题: 对象访问成员的问题 [打印本页]

作者: 郭天龚    时间: 2013-7-15 12:27
标题: 对象访问成员的问题
本帖最后由 郭天龚 于 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的方式来访问他的私有成员。那位大神帮我解惑一下,谢谢!

作者: longlangcx    时间: 2013-7-15 12:53
本帖最后由 longlangcx 于 2013-7-15 12:55 编辑

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

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

你写的这俩程序,上面的可以直接访问是因为访问代码写在本类当中,具有访问权限;下面的不可以访问是因为访问代码写在其他类当中,没有访问权限。
作者: 林杰    时间: 2013-7-15 13:40
你看清你写的P.AGE在哪了么?PRIVATE将本类实现细节对外部隐藏,对内不隐藏,你在本类中自然可以调用
作者: 郭天龚    时间: 2013-7-16 09:12
longlangcx 发表于 2013-7-15 12:53
private的意义在于,private成员只能被本类对象访问,注意,是本类对象,而不是本对象。在本类方法中,可以 ...

谢谢你的解惑!




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