java面向对象三大特性之封装性(全面解读)和面试分析
2020-07-17 15:43
120 查看
封装性
一、关于封装性的三问,3W
1.封装性的引入
- 当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。
- 除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。
- 这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setLegs())
- 同时,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为私有的(private).
–>此时,针对于属性就体现了封装性。
1.1 通俗理解
- 简单地讲:使用者对类内部定义的属性( 对象的成员变量) 的直接操作会导致数据的错误、混乱或安全性问题。
- 保护的方式:信息隐藏
2.引入封装性的面试规范解答
- 程序设计追求“高内聚,低耦合”
高内聚:类的内部数据操作细节自己完成,不允许外部干涉。
低耦合:仅对外暴露少量的方法用于使用。 - 隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可拓展性、可维护性。
即把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装性的设计思想。
二、封装性的体现
1.语法规范
Java中通过将类的属性xxx私有化(private)(数据声明为私有的(private)),再提供公共的(public)方法:getXxx() 和setXxx()实现对该属性的操作(获取和设置该属性的值)
1.2 目的
- 隐藏一个类中不需要对外提供的实现细节;
- 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
- 便于修改,增强代码的可维护性;
2. 拓展封装性的体现
- 如上;
- 不对外暴露的私有的方法;
- 单例模式(将构造器私有化);
- 如果不希望类在包外被调用,可以将类设置为缺省的(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 |
调用顺序由小到大:类内部<同一个包 <不同包的子类<同一个工程
注意:
- 种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类;
- 修饰类的话,只能使用:(缺省)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()); } }
相关文章推荐
- java三大特性之多态性(全面解读)和面试分析
- 【java基础知识】面向对象的三大特性之封装
- java语言基础(23)——面向对象三大特性(封装、继承、多态)
- Java — 面向对象的三大特性(封装、继承、多态)
- Java面向对象的三大特性之--《封装》
- Java面向对象的三大特性 封装
- java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍
- Java之面向对象的三大特性:封装,继承,多态讲解
- 深入理解Java面向对象三大特性 封装 继承 多态
- 智渔课堂官方免费教程十三:Java面向对象三大特性之封装
- java笔记—封装、继承、多态[面向对象的三大特性]
- 第十五、Java面向对象三大特性之封装
- java:面向对象三大特性之一 封装
- Java基础知识:浅谈面向对象三大特性之封装
- Java的面向对象的三大特性 封装 继承 多态
- java面向对象三大特性:封装、继承、多态
- java面向对象的三大特性----封装、继承、多态
- java面向对象三大特性-封装
- Java面向对象的三大特性——继承、多态、封装
- Java面向对象三大特性--封装、继承、多态