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

本章目标

  • 掌握封装的产生目的
  • 掌握封装的实现
  • 掌握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只是最基本的一种形式,也是比较常见的形式。
类的每一个属性都必须封装

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,427评论 1 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,347评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,851评论 6 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,906评论 18 399
  • 大龄女青年小B最近终于憋出一朵不错的桃花 虽是相亲认识的,可是他幽默风趣又成熟沉稳,第一眼就对上小B的路,而他也对...
    陶瓷兔子阅读 8,872评论 18 124