第五章:面向对象基础——封装性 。

2017-09-25  本文已影响0人  孤意的学习笔记

本章目标

1、具体内容

1.1、为什么要有封装?

封装就是保护内容。
保证某些属性和方法可以不被外部看见。

观察以下代码,是否存在问题?

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

从语法上没有问题,但是从实际角度看,以上的代码不符合要求。
不合适的根本原因在于属性可以直接被外部所访问

1.2、实现封装

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() ;
    }
};
编译时出现以下问题:
Error:(11, 12) java: name可以在Person中访问private
Error:(12, 12) java: age可以在Person中访问private

提示是一个私有的访问权限,则意味着,外部根本无法调用。

1.3、访问封装的内容

因为这些属性肯定要表示出一些实际的意义,那么这些意义的内容肯定应该由外部设定,所以在整个Java中对于封装性的访问就给出了一个明确的原则,此原则必须遵守。
被封装的属性如果需要被访问,则需要编写gettersetter方法完成。

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

以上的代码只是可以访问封装属性了,但是并没有加入到检测的措施。如果年龄设置的有问题,则不应该为属性赋值。

现在该在settergetter哪个方法中加入检验呢?

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

2、总结

1、封装性的目的
2、settergetter方法的作用
3、封装性在Java中有很多种形式,private只是最基本的一种形式,也是比较常见的形式。
类的每一个属性都必须封装

上一篇 下一篇

猜你喜欢

热点阅读