关闭

Java-面向对象(基础篇)--封装性

标签: java封装性private
148人阅读 评论(0) 收藏 举报
分类:

封装性
封装性是面向对象的第一大特性,所谓的封装性就是指对外部的不可见性。问题如下:

class Person{
    String name ;           // 声明姓名属性
    int age ;               // 声明年龄属性
    public void tell(){
        System.out.println("姓名:" + name + ",年龄:" + age) ;
    }
};
public class EncDemo01{
    public static void main(String arsgh[]){
        Person per = new Person() ; // 声明并实例化对象
        per.name = "张三" ;           // 为name属性赋值
        per.age = -30 ;             // 为age属性赋值
        per.tell() ;
    }
};

程序运行的结果如下:

姓名:张三,年龄:-30

由上面程序可以发现,年龄(age)赋值为-30岁,这在程序中没有任何问题,但是在实际生活中这显然是不合法的数据,因为人的年龄不可能是-30岁。所以为了避免程序中发生这样的错误,在一般的开发中往往将类中的属性封装(private),封装的格式如下:
【封装格式】

属性封装:private 属性类型 属性名称
方法封装:private 方法返回值 方法名称(参数列表){}

【为程序增加封装属性】

class Person{
    private String name ;           // 声明姓名属性
    private int age ;               // 声明年龄属性
    public void tell(){
        System.out.println("姓名:" + name + ",年龄:" + age) ;
    }
};
public class EncDemo02{
    public static void main(String arsgh[]){
        Person per = new Person() ; // 声明并实例化对象
        per.name = "张三" ;           // 为name属性赋值
        per.age = -30 ;             // 为age属性赋值
        per.tell() ;
    }
};

程序运行结果为:

EncDemo02.java:11: 错误: name可以在Person中访问private
                per.name = "张三" ;                     // 为name属性赋值
                   ^
EncDemo02.java:12: 错误: age可以在Person中访问private
                per.age = -30 ;                         // 为age属性赋值
                   ^
2 个错误

本程序在属性前面加了private,进行了封装,所以不能由对象直接进行访问,这样就可以保证对象无法直接去访问类的属性,从而保证对入口处有所控制。需要进行访问时,在Java开发中对于私有属性的访问有了明确的规定:只要是封装的属性,则必须通过setter和getter方法设置和取得。
在程序中可以通过setter和getter方法进行设置和取得属性,如果想对设置的值进行检查,则只需要在setter()方法中加入检查的代码即可。
【加入检查代码】

class Person{
    private String name ;           // 声明姓名属性
    private int age ;               // 声明年龄属性
    public void setName(String n){  // 设置姓名
        name = n ;
    }
    public void setAge(int a){      // 设置年龄
        if(a>=0&&a<=150){           // 加入验证
            age = a ;
        }
    }
    public String getName(){        // 取得姓名
        return name ;
    }
    public int getAge(){            // 取得年龄
        return age ;
    }
    public void tell(){
        System.out.println("姓名:" + name + ",年龄:" + age) ;
    }
};
public class EncDemo04{
    public static void main(String arsgh[]){
        Person per = new Person() ; // 声明并实例化对象
        per.setName("张三") ;     // 调用setter设置姓名
        per.setAge(-30) ;           // 调用setter设置年龄
        per.tell() ;                // 输出信息
    }
};

程序运行结果:

姓名:张三,年龄:0

.因为设置了检查代码,所以年龄设置不正确,则不会把值赋给age属性的,所以运行结果为默认属性值0.
关于private的补充说明
(1) 在以后的开发中,类中的属性都必须封装,封装之后的属性值必须通过setter和getter方法访问。
(2) 面向对象的封装性本身并不是单单指private关键字。
(3) 正常情况下,类中的方法直接写上方法名就可以进行调用,但是如果要强调是本类中的方法,可以在调用时按“this.方法名称”的形式调用。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13130次
    • 积分:734
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:1篇
    • 译文:0篇
    • 评论:6条
    博客专栏
    文章分类
    我的GitHub
    https://github.com/aotuzhao
    我的站点【完善ing。。。】
    https://aotuzhao.github.io/
    最新评论