您的位置:首页 > 编程语言 > Java开发

java面向对象三大特性之封装性(全面解读)和面试分析

2020-07-17 15:43 120 查看

封装性

  • 2.引入封装性的面试规范解答
  • 二、封装性的体现
  • 2. 拓展封装性的体现
  • 3.封装性的体现,需要权限修饰符
  • 4.总结封装性
  • 三、代码展示
  • 一、关于封装性的三问,3W

    1.封装性的引入

    1. 当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。
    2. 除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。
    3. 这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setLegs())
    4. 同时,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为私有的(private).
      –>此时,针对于属性就体现了封装性。

    1.1 通俗理解

    1. 简单地讲:使用者对类内部定义的属性( 对象的成员变量) 的直接操作会导致数据的错误、混乱或安全性问题。
    2. 保护的方式:信息隐藏

    2.引入封装性的面试规范解答

    1. 程序设计追求“高内聚,低耦合”
      高内聚:类的内部数据操作细节自己完成,不允许外部干涉。
      低耦合:仅对外暴露少量的方法用于使用。
    2. 隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可拓展性、可维护性。
      即把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装性的设计思想。

    二、封装性的体现

    1.语法规范

    Java中通过将类的属性xxx私有化(private)(数据声明为私有的(private)),再提供公共的(public)方法:getXxx() 和setXxx()实现对该属性的操作(获取和设置该属性的值)

    1.2 目的

    1. 隐藏一个类中不需要对外提供的实现细节;
    2. 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
    3. 便于修改,增强代码的可维护性;

    2. 拓展封装性的体现

    1. 如上;
    2. 不对外暴露的私有的方法;
    3. 单例模式(将构造器私有化);
    4. 如果不希望类在包外被调用,可以将类设置为缺省的(default)

    3.封装性的体现,需要权限修饰符

    3.1 权限修饰符定义

    限定对象对该类成员的访问权限。

    3.2 权限修饰符的种类:4种

    Java规定的4种权限(从小到大排列):private、(缺省)default、protected 、public

    种类 类内部 同一个包 不同包的子类 同一个工程
    private ok no no no
    缺省(defau) ok ok no no
    protected ok ok ok no
    public ok ok ok ok

    调用顺序由小到大:类内部<同一个包 <不同包的子类<同一个工程
    注意:

    1. 种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类;
    2. 修饰类的话,只能使用:(缺省)default、public;

    4.总结封装性

    Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。

    三、代码展示

    /* 1.创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
    用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。
    2.练习2:
    2.1. 在前面定义的Person类中添加构造器,利用构造器设置所有人的age属性初始值都为18。
    2.2. 修改上题中类和构造器,增加name属性,使得每次创建Person对象的同时初始化对象的age属性值和name属性值。
    */
    class Person2 {
    
    private int age;
    private String name;
    
    public Person2(){
    age = 18;
    }
    
    public Person2(String n,int a){
    name = n;
    age = a;
    }
    
    public void setAge(int a){
    if(a < 0 || a > 130){
    //			throw new RuntimeException("传入的数据非法!");
    System.out.println("传入的数据非法!");
    return;
    }
    
    age = a;
    
    }
    
    public int getAge(){
    return age;
    }
    
    //绝对不要这样写!!
    //	public int doAge(int a){
    //		age = a;
    //		return age;
    //	}
    public void setName(String n){
    name = n;
    }
    public String getName(){
    return name;
    }
    
    }
    //在PersonTest类中实例化Person类的对象b,调用setAge()和getAge()方法,体会Java的封装性。
    class PersonTest2 {
    public static void main(String[] args) {
    
    Person2 p1 = new Person2();
    //		p1.age = 1;编译不通过
    
    p1.setAge(12);
    
    System.out.println("年龄为:" + p1.getAge());
    
    //		p1.doAge(122);
    
    Person2 p2 = new Person2("Tom", 21);
    System.out.println("name = " + p2.getName() + ",age = " + p2.getAge());
    
    }
    }
    //编写两个类,TriAngle和TriAngleTest,其中TriAngle类中声明私有的底边长base和高height,同时声明公共方法访问私有变量。
    //此外,提供类必要的构造器。另一个类中使用这些公共方法,计算三角形的面积。
    class TriAngle { //angle:角    angel:天使
    
    private double base;//底边长
    private double height;//高
    
    public TriAngle(){
    
    }
    
    public TriAngle(double b,double h){
    base = b;
    height = h;
    }
    
    public void setBase(double b){
    base = b;
    }
    public double getBase(){
    return base;
    }
    public void setHeight(double h){
    height = h;
    }
    public double getHeight(){
    return height;
    }
    
    }
    class TriAngleTest {
    public static void main(String[] args) {
    
    TriAngle t1 = new TriAngle();
    t1.setBase(2.0);
    t1.setHeight(2.4);
    //		t1.base = 2.5;//The field TriAngle.base is not visible
    //		t1.height = 4.3;
    System.out.println("base : " + t1.getBase() + ",height : " + t1.getHeight());
    
    TriAngle t2 = new TriAngle(5.1,5.6);
    System.out.println("base : " + t2.getBase() + ",height : " + t2.getHeight());
    }
    }
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: