黑马程序员技术交流社区

标题: 同类创建出来的2个对象,是否可以相互访问对方的私有变量 [打印本页]

作者: jkenny    时间: 2014-2-11 17:51
标题: 同类创建出来的2个对象,是否可以相互访问对方的私有变量
今天刚学到毕向东老师第五天的视频,this关键字的应用,他在视频里面做了一个(2个人比较年龄的例子)
方法是同一个person类创建出2个对象,person类里有个public成员方法是比较2个人的age的,只需要向这个方法传一个对象即可。
结果是没问题,但我发现类里定的age是:private int age;
那么这个对象本身调用自己的age值是没问题,可它为什么可以得到传进来对象的age值啊?
----------------------------
因此我做了一些测试得出一些结论,不知道正确不。知道的大哥告诉我下。谢谢
我的结论:
//同一个类创建出来的2个对象,内的public成员方法可以相互访问,对象内的private成员变量。
//不同一个类创建出来的2个对象,内的public成员方法不可以相互访问,对象内的private成员变量,只能访问自身对象内的private成员变量。

我把测试的代码和过程写在博客里了,不知道这篇博客文章可不可以算,报名要求的10篇blog文章。
http://ynnekj.blog.163.com/blog/static/172839356201411152459760/

作者: jkenny    时间: 2014-2-11 18:22
  1. class pDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 per x = new per(10,"白");
  6.                 boolean tf=x.cmpAge(new per(20,"黑"));
  7.                 System.out.println(tf);
  8.         }

  9. }


  10. //---------------下面是person类
  11. class per
  12. {
  13.         private int age;
  14.         private String name;

  15.         public per(int age,String name)
  16.         {
  17.                 setP(age,name);
  18.         }

  19.         public void setP(int age,String name)
  20.         {
  21.                 this.age=age;
  22.                 this.name=name;
  23.         }
  24.        
  25.         public void getP()
  26.         {
  27.                 System.out.println("age="+age+" name="+name);
  28.         }

  29.         public boolean cmpAge(per p)
  30.         {
  31.                 return this.age>p.age;  //我的问题就是这里p.age为什么可以获取到值,
  32.         }                                //它不是另外一个对象里面private 定义的私有成员吗
  33.                                         //难道是因为它是同一个类实例出来的对象?
  34. }
复制代码
返回结果是false。

作者: 何苦似梦离    时间: 2014-2-11 19:14
p.age,编译器判断它在类中,所以可以访问.
作者: e.c    时间: 2014-2-11 19:32
我只能说我觉得原因可能是:
per类的私有变量只有per类本身以访问。其它类不能访问。而在内存里。类的方法都是在方法区的。
虚拟机进行安全检查时发现是per类的方法要访问"黑"的私有变量,所以是可以的。
作者: 李金中    时间: 2014-2-11 20:35
不管修饰符是不是private,类内是可以访问该成员变量的。访问权限是针对类内,类外,子类而言的。
你定义一个类的对象,再去访问该对象的私有成员,肯定是不可以的,因为是在类外访问。
同理, 你定义一个父类的protected成员变量,在子类内是可以访问到的,可是你定义一个子类对象,便访问不到了。
所以,你定义一个private成员变量,只要是在类内,不管是不是访问该类对象的私有变量,还是直接访问,都是OK的。
作者: jkenny    时间: 2014-2-12 00:41
李金中 发表于 2014-2-11 20:35
不管修饰符是不是private,类内是可以访问该成员变量的。访问权限是针对类内,类外,子类而言的。
你定义一 ...

谢谢你的解答。
你说的我都知道,但我的问题你发现没,
首先我写了个per的类,然后per类里面有个方法,调用时需要传入一个per类型的对象句柄,然后用这个句柄获取该传入对象的age成员变量的值。然后在和本身这个对象的age值进行比较。
也就是说,这是2个不同的对象。
x(白)对象当然按照你说的可以取到private age的值,但p(黑)它是另一个对象,直接使用p.age是应该不能获取值的啊(因为age加了private).而且现在p的情况也不是你说的“只要在类内”,因为它现在是在x的对象(类)内。

x和p是不同的对象,只是类相同而已,那在x对象中怎么可以获取p对象中的private 成员变量呢?

当然我自己测试p.age是可以获取到值的,我自己的理解是:因为他们是同一个类实例出来的对象。
我测试使用2个不同的类在按照这样做就不能获取到值了。
作者: jkenny    时间: 2014-2-12 00:52
e.c 发表于 2014-2-11 19:32
我只能说我觉得原因可能是:
per类的私有变量只有per类本身以访问。其它类不能访问。而在内存里。类的方法 ...

谢谢回答。
看起来有点晕,但有点启发我另一种想法。
作者: jkenny    时间: 2014-2-12 00:54
何苦似梦离 发表于 2014-2-11 19:14
p.age,编译器判断它在类中,所以可以访问.

谢谢回答。
可是他不是在自己的类中啊!严格来说是,它不在自己的对象中啊,他是在x的对象里。
如果是在自己里,那当然可以访问。
作者: 唐宋元明清    时间: 2014-2-12 10:21
本帖最后由 唐宋元明清 于 2014-2-12 10:22 编辑

35.        public boolean cmpAge(per p)

36.        {

37.                return this.age>p.age;  //我的问题就是这里p.age为什么可以获取到值,

38.        }              

以上为嘛能获取p.age的值呢?
因为任何成员属性都必须是对象自己调用才能调用到。
但是如果加上private修饰成员,那么这个对象必须在本类中才能访问成员;
或者对象类必须对外提供访问方法,才能在对象类外利用这个访问方法访问成员。
这道题是因为你需要比较的两个对象都在对象类中,所以成员属性private修饰后仍能调用;
如果你建立个专门的工具类,里面定义两个对象比较age那么就会返回只能在per类中访问private成员。

作者: 李金中    时间: 2014-2-12 11:07
jkenny 发表于 2014-2-12 00:41
谢谢你的解答。
你说的我都知道,但我的问题你发现没,
首先我写了个per的类,然后per类里面有个方法,调 ...

对象是对象,类是类;对象是类的实例化。 怎么按你说的,对象跟类一个样了呢?
作者: 李金中    时间: 2014-2-12 11:14
jkenny 发表于 2014-2-12 00:41
谢谢你的解答。
你说的我都知道,但我的问题你发现没,
首先我写了个per的类,然后per类里面有个方法,调 ...

对象在运行的时候开辟空间,存储起来;类就是一段编译时存在的代码。两者 不一样。 你说的什么 在x的对象(类)内, 怎么搭边呢,大哥。。。不一样的东西。。。
作者: 梵天的梦    时间: 2014-2-12 11:39
不对吧,即使是同一个类,创建的两个对象public成员方法也不能相互访问;我刚看了您的代码,那个cmpAge(per p)方法的参数接受的是一个per对象,所以this.age获取了你自己年龄,p.age获取到了你要作比较的那个人的年龄值。不知道对不对,我是这么理解的。
作者: 周昭民    时间: 2014-2-12 12:07
jkenny 发表于 2014-2-12 00:41
谢谢你的解答。
你说的我都知道,但我的问题你发现没,
首先我写了个per的类,然后per类里面有个方法,调 ...

我觉得吧,你只要理解per类里面中,这个方法可以访问到本类中所有成员就行了,包括被private修饰的。因为正常的情况下,在一个类中,自己本类的方法访问访问本类中的任一成员不是天经地义的事,包括已经被私有化的。
另外,提示一下。注意一下同学你的代码书写格式,类名首字母就不要写成小写的了,规范就要去遵守,大家都去遵守的事为啥你就不遵守呢
作者: 戒爱    时间: 2014-2-12 12:12
我看来你注释出的问题,对象的私有成员?应该是类的私有变量成员吧,而不是对象的私有,这里的私有是谁对谁的关系你有点没有理解清楚,也不是因为他是同一个类实例出来的对象所以能够访问(如果你把函数方法体封装在一个类中,然后把对象调用放到另外一个类中的情况下你就要看你访问的内容的访问权限,同类中没有访问障碍,)如代码所示
  1. class person {
  2. private name;
  3. public void setName(String name)
  4. {
  5. this.name = name;
  6. }
  7. }

  8. class TestPerson {
  9. public static void main(String args[]) {
  10. Person p = new Person();
  11. p.setName(“戒爱”);//一句话:类内部互访无障碍,超出类以外看访问权限
  12. }
复制代码



---------------不知道我说的是不是准确,我现在是这样思考的,你考虑下吧-----------
作者: 戒爱    时间: 2014-2-12 12:15
唐宋元明清 发表于 2014-2-12 10:21
35.        public boolean cmpAge(per p)

36.        {

恩恩,类中互访无阻碍
作者: jkenny    时间: 2014-2-12 23:08
好把,谢谢各位的回答,此问题到此为止。




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