黑马程序员技术交流社区

标题: 私有问题。 [打印本页]

作者: 史政法    时间: 2013-4-5 21:41
标题: 私有问题。
本帖最后由 史政法 于 2013-4-6 06:11 编辑
  1. class  Demo
  2. {
  3.         public static void sop(Object obj)
  4.         {
  5.                 System.out.println(obj);
  6.         }

  7.         public static void main(String[] args)
  8.         {
  9.                 //p.age;  编译失败,因为对象不能访问类中的私有成员。
  10.                 Person p1 = new Person(10);
  11.                 Person p2 = new Person(20);
  12.                 sop(p1.getAge(p2));
  13.         }
  14. }

  15. class Person
  16. {
  17.         private int age;
  18.         Person(int age)
  19.         {
  20.                 this.age = age;
  21.         }
  22.         public int getAge(Person p)
  23.         {
  24.                 return p.age;//编译通过,接收一个对象,调用对象的私有成员?
  25.         }
  26. }


  27. class Test
  28. {
  29.         public int getAge(Person p)
  30.         {
  31.                 return p.age;//编译失败,接收一个对象,调用对象的私有成员?为什么Person中的方法接收一个对象,调用对象的私有成员可以,而Test中却不行呢?
  32.         }
  33. }
复制代码
编译通过的部分最好说明一下内存中执行的过程。。。。。。

作者: 赵晓东    时间: 2013-4-5 21:49
age定义在Person中,并且为私有,意思就是age这个变量只在Person中起作用,被保护了起来,别的类时访问不到的,因为别的类没有权限
作者: 黑马_位志国    时间: 2013-4-5 21:52
java类具有三大特性:封装、继承和多态。
类的封装性即不能让外面的类随意修改一个类的成员变量;在定义一个类的成员(包括变量和方法)时,使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用;为实现封装性,常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,一般定义两个方法来实现这两种操作,即:getXxx()与setXxx();一个类就是一个模块,应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他的一切内容。在进行程序设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚,弱耦合
作者: 范鹏飞    时间: 2013-4-5 22:33
  1. class Demo1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Person p1 = new Person(10);
  6.                 Person p2 = new Person(20);

  7.                 //输出p1 的年龄值
  8.                 System.out.println(p1.getAge());
  9.         }
  10. }
  11. class Person
  12. {
  13.         //将年龄属性私有化
  14.         private int age;

  15.         //有参构造函数
  16.         Person(int age)
  17.         {
  18.                 this.age = age;
  19.         }

  20.         //返回年龄的值
  21.         public int getAge()
  22.         {
  23.                 return age;
  24.         }

  25. }
复制代码
----------------------------------------------------------
  1. public int getAge()  //这儿是不需要传参数的,给年龄传参赋值后,年龄已经有了
  2.         {
  3.                 //return p.age;//编译通过,接收一个对象,调用对象的私有成员?

  4.                                 return this.age;//这儿还没创建对象,故不能写成p.age
  5.         }
复制代码
感觉你的程序逻辑有些乱,我重新写下
作者: 郭沐昌    时间: 2013-4-5 22:38
get X X   应该 跟 set X X 相对应 能方便 观看些吧!
再说你也没有this指向 啊
作者: 史政法    时间: 2013-4-6 06:09
这段代码运行的步骤是这样的:
栈内存有两个引用,p1,p2,堆内存有两个对象Person(10),Person(20),
p1.getAge(p2),p1调用自己的getAge方法,将p2作为参数传递进去,返回的值是调用p2的age。
因为私有的成员只能在本类中进行访问,所以,如果将p.age换成this.age好理解一些,p1调用自己的方法,返回自己的age,把p.age化成p2.age,同this.age相同,两个都是引用,都是本类中的引用使用自己的age
这也说明了私有只在本类中有效这句话的意思是,当一个成员被私有后,通过方法暴露出去,使外界可以访问到,而调用方法是需要引用的,谁在调用方法,操作的就是谁。而在本类中有引用指向自己的私有成员,是可以被访问到的。也就是功能中可以进行this.访问,或者接收其他的本类对象的引用进行访问,同this.是一样的。都是本类的引用在调用本类的私有成员。。。。一句话的总结就是:本类对象中出现了私有成员,私有成员是可以被本类中对象的引用访问到的。。。而Test中编译失败的原因就是因为Person对象中的私有成员不可以在本类以外的地方建立引用访问私有成员。。。。。。。。。。。而如果Person中有设置年龄方法的话,接收的参数设置给的年龄也是引用中的年龄,也就是堆内存中的年龄,,,,,因为有个this.的引用。。。。操作的都是引用中的数据。返回的也是。




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