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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 钟伟杰 中级黑马   /  2013-4-16 20:27  /  1831 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 钟伟杰 于 2013-4-16 22:20 编辑

  1. <P> class Person
  2. {
  3. private int age;
  4. public void setAge(int age)
  5. {
  6.    this.age=age;
  7. }
  8. public int getAge()            
  9. {
  10.   return age;
  11. }
  12. void speak()
  13. {
  14.   System.out.println("age="+age);
  15. }
  16. }
  17. class Demo
  18. {
  19. public static void main(String[] args)
  20. {
  21.    Person p = new Person();
  22.    p.setAge(21);
  23.    p.speak();     
  24. }
  25. }
  26. </P>
复制代码
自定义类中,什么时候需要私有化?上面代码把getAge()删除后结果还是21,getAge()方法有什么用呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

9 个回复

倒序浏览
。。。。。。
这让我怎么说好。
如果你不想让别人直接操作你的成员变量或者成员函数,你可以把它私有化。
但如果你的成员变量私有了,调用它的成员函数却没有私有,别人可以间接地通过你的成员函数调用私有化变量。
你的输出语句是speak()函数里的。你删除getAge方法有用才怪了。get方法只是为了得到变量的值,以便对其操作。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我们尽量不要直接操作属性,而且有些属性我们也不希望被改动,这样就把属性设置成private的一般用private修饰的属性,我们都会添加上getXxx() setXxx()方法,这样访问的话直接调用其getXxx() setXxx()方法,因为private修饰的属性,只有在本类才可以直接操作,所以原理就是:通过调用该类的一个公共方法(getXxx() setXxx()),在该方法里面操作私有属性.将类的成员变量声明为私有的(private),在提供一个或多个公有(public)方法来实现对该成员变量的访问或修改,这种方式就被称为封装,1.可以达到隐藏类的实现细节,2.让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;3.便于修改,增强代码的可维护性;4.可进行数据检查。上面代码因为是在同一个类中,所以删掉private结果不变,如果在另一个外部类调用的话,没有getXxx(),setXxx(),方法不可以

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
私有化通常主要是将一些会对程序造成安全隐患的属性进行隐藏。打个比方说。就说人的年龄,人的年龄是不能为负数或者无限大的。并且不可能被任意访问,任意访问,谁都可以更改,说不好哪个就改成不符合现实的属性出来,所以这时候就需要私有化,谁都不能更改,但是我会提供给你一个访问的方式,你只能访问,不能修改。
私有化就是这样的用途。
回复 使用道具 举报
private私有是封装的一种,可以让程序安全性更高。
就像你的电脑,有点私人的东西,不想人看,但要是你爸妈非要看
就让他们看你允许的那几个文件。
这就是为什么有提供公有的方法去访问私有的对象。
public是公用的,访问权限比较大。
回复 使用道具 举报
楼上说得对,私有化是为了对变量起到保护的作用,保证对变量的读取和赋值符合要求,比如说如果题目中要求输入的年龄必须大于0,那么私有化就有用了,可以在SetAge()中加上条件判断,如下代码:
  1. private int age;
  2.         public void setAge(int age)
  3.         {
  4.             if (age > 0)
  5.             {
  6.                 this.age = age;
  7.             }
  8.             else
  9.             {
  10.                 this.age = 0;
  11.             }
  12.         }
复制代码
至于getAge()是为了得到变量的值,比如你定义个整型变量,将getAge()的返回值给它,如下代码,则i=21;
  1.         public static void main(String[] args)
  2.         {
  3.             Person p = new Person();
  4.             p.setAge(21);
  5.             int i = p.getAge();
  6.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
易杰 中级黑马 2013-4-16 20:54:16
7#
属性私有化的目的是使外界不能直接访问,外界直接可能造成数据错误。比如说:年龄吧,年龄是不能为负数,如果外界直接能访问的话,就可以将一个负数赋给年龄。所以为了安全起见,一般类中定义的属性都会私有化。
属性私有化后外界不能通过对象.属性名的方式直接访问了,要通过类中定义的公开方法来访问属性。这样得好处就是,可以在方法中可以对外界的操作进行控制。
getAge()是供外界获取Age属性的,因为Age属性私有化,外界不能通过对象名.Age的方式获得Age属性。只能通过getAge()方法来获取。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
呵呵 楼上的回答得都很不错,不过都没回答出怎么删除getAge()后结果还是21,这个一两句话说真说不明白,要画内存图的,其中涉及this关键字的用法,建议在看看视屏吧,呵呵,现在只能告诉你p.speak()所指向的地址值是堆中p开辟的地址,这个地址中的age已被公共的setAge()方法修改为21,所以通过p.speak()说出的age是21
回复 使用道具 举报
private作为权限最低的修饰符,用到它就是为了保护自己数据,不被改动,安全性更高.

正因为你的私有化,外界要访问,只能通过public共有的方法去得到,这里java固定为set--赋值.get--获值方法进行操作.

回复 使用道具 举报
楼主应该明白私有访问修饰符private的用法
如果一个类中的方法或者属性被private所修饰了,那么这些方法和属性就只能被自己本身访问
就算是子类也无法访问父类私有的方法和属性,
不过 你可以在父类中定义set和get方法来获取私有的属性或者方法
希望对你有帮助!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马