美文网首页
第五章:面向对象基础——封装性 。

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

作者: 孤意的学习笔记 | 来源:发表于2017-09-25 15:13 被阅读0次

    本章目标

    • 掌握封装的产生目的
    • 掌握封装的实现
    • 掌握setter和getter方法的定义

    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、实现封装

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

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

    1.3、访问封装的内容

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

    • 例如:现在有一个属性private String name;
      Setter(设置): public void setName(String n){ }
      Getter(取得): public String getName()
    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哪个方法中加入检验呢?

    • setter方法中加入验证。
    • getter方法中只是把内容简单的取回即可。
    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只是最基本的一种形式,也是比较常见的形式。
    类的每一个属性都必须封装

    相关文章

      网友评论

          本文标题:第五章:面向对象基础——封装性 。

          本文链接:https://www.haomeiwen.com/subject/flxdextx.html