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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋枢浩 黑马帝   /  2012-2-8 23:53  /  2735 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 宋枢浩 于 2012-2-9 11:49 编辑

看毕老师视频
对于pubilc和private
class Person
{
        private int age;
        public void setAge(int a)
        {
                if(a>0&&a<120)
                age = a;
                else
                        System.out.println("false");
        }
        void speak()
        {
                System.out.println("age="+age);
        }
}
class PersonDemo

{
        public static void main(String[] args)
        {
                Person p = new Person();
                p.setAge(-20);
                p.speak();
        }
}
我看不出来区别,因为年龄还是可以随意输入。我把private去掉运行结果也是一样的。那他的安全性到底是怎么体现的啊。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

11 个回复

倒序浏览
因为你只可以用setAge来访问这个变量而不是用对象.变量来赋值
它的方法里面不是有判断范围才输入吗?
这不就是安全性?
要是本来只可以复制1-100
但是你可以随意的赋值到10000
那这样的系统肯定会出错啊

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
你是想问javabean是怎么保证安全的吧?
把get set的属性在类里面设置为: private,而把get set 该属性的方法设置为public,就可以防止直接通过该类的 对象.属性 来修改该属性的值,而必须通过get set方法来修改该属性的值。因为被private修饰的属性只能被该类内部访问。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
我运行的结果是:
false
age=0
private是本类对象才有权限使用
我认为安全是防止年龄超过120和年龄是负数
回复 使用道具 举报
不明白你的疑问在哪里?
回复 使用道具 举报
你这代码,我不敢猜结果,如果age是private那么他只能在改类内部被赋值,或者通过setAge赋值,去掉private就是default,就可以在外部类中直接age=赋值了,和setAge两种方式赋值
回复 使用道具 举报
age不可以直接赋值,只有通过setAge赋值!

  你如果去掉了 private 就下面的setAge就可以省略了, 直接给age赋值了,  而通过setAge赋值的安全性就体现在这里 让你知道什么时候赋值, 不容易出错。
回复 使用道具 举报
class Person
{
        private int age;//类中成员私有,防止外部对象直接进行访问。也就是防止了数据泄露。
       /*
            在某些情况下需要将对象的成员变量或者成员函数进行私有,避免被子类所继承。
      */
        public void setAge(int a)
        {
                if(a>0&&a<120)  //成员函数对成员变量进行操作,使成员变量遵循了一定的规则。
                age = a;
                else
                        System.out.println("false");
        }
        void speak()
        {
                System.out.println("age="+age);
        }
}
class PersonDemo

{
        public static void main(String[] args)
        {
                Person p = new Person();
                p.setAge(-20);
                /*如果此处对Person的成员变量赋值后,带有private的成员变量访问只能通过Person类中的成员函数调用形成间接访问,
                    但是如果去掉private 此处赋值后仍能p.age访问。
               */
                p.speak();//这是我们为了便于用户访问专门暴露出来的一个成员方法。
        }
}

回复 使用道具 举报
秦碧 黑马帝 2012-2-9 09:42:52
9#
安全体现是这样的:
如果你去掉private,使用public 在主函数中可以这样修改
p.age=-20,这时程序无法根据age的大小判断赋值是否合乎常理
回复 使用道具 举报
谢谢LS的各位同学的回答。
我现在已经懂了,private的作用就是防止在主函数直接调用p.age来进行赋值吧。从而可以在public中验证a的范围,保证数据输入的正确性。
我刚刚又调试了几次。确实是用setAge才能访问!
回复 使用道具 举报
许涛 黑马帝 2012-2-9 13:42:30
11#
安全性体现在:对成员变量私有化后,外部要想访问成员变量,则只能通过set方法间接访问,此时我们可以通过在set方法里设置判断条件,来限制不合法数据的输入,提高代码健壮性。
回复 使用道具 举报
李文 黑马帝 2012-2-9 14:26:02
12#
用private定义属性的话  想要修改属性的值只能通过getAge()方法取得,用setAge()方法设置,在方法中通过函数来控制范围。
而public能直接对属性取得和设置,所以private的安全性比较高
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马