Java面向对象--三大基本特征之封装性和继承性
Java面向对象的三大基本特征是:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism),这三大基本特征是学习Java面向对象开发的基础和重点。本篇博客将详细介绍三大基本特征中封装性和继承性的用法。
目录:
☍ 封装和隐藏
封装的思想
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合。
☃ 我们程序设计追求“高内聚,低耦合”
☄ 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉
☄ 低耦合 :仅对外暴露少量的方法用于使用
☃ 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。”
封装的原因
☃ 使用者对类内部定义的属性( 对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题
信息的封装和影藏
Java中通过将数据(属性/变量)声明为私有的(private),再提供公共的public方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
◌ 隐藏一个类中不需要对外提供的实现细节
◌ 使用者只能通过方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作
◌ 便于修改,增强代码的可维护性
例子:
class Animal{
//定义private变量,只允许Animal类访问
private int legs;
//定义public类型set和get方法,允许外部类访问
public void setLegs(int legNum){ //设置legs属性
if(legNum!=0 && legNum!=2 && legNum!= 4){
System.out.println("哇哦!这个动物腿的数量很不同啊。");
return;
}
legs = legNum;
}
public int getLegs(){ //获取legs属性
return legs;
}
//eat方法
public void eat(String food){
System.out.println("这个动物吃" + food);
}
}
class Dog{
public static void main(String args[]){
Animal a1 = new Animal();
a1.setLegs(4); //正确赋值方式
//a1.legs = 4; 错误赋值方式,legs为private权限
System.out.println("狗有" + a1.getLegs() + "条腿");
a1.eat("骨头");
}
}
➥ set和get方法只是封装性的一个体现(隐藏属性),并不能完全代表Java面向对象的封装性。
➥ 封装性还可以体现在方法上,只需对方法加上权限(private),使得方法只能在当前类中使用,不对外暴露私有方法
➥ 封装性的体现是多样的,不只是体现在某一种使用上
四种访问权限修饰符
Java权限修饰符public、protected、(缺省)、private置于类的成员定义前,用来限定对象对该类成员(属性、方法、构造器、内部类,不包含代码块‘{}’)的访问权限
修饰符 | 同一个类 | 同一个包 | 不同包的子 类 | 同一个工程(不同包,非子类) |
---|---|---|---|---|
public | ✔ | ✔ | ✔ | ✔ |
protected | ✔ | ✔ | ✔ | |
缺省(default) | ✔ | ✔ | ||
private | ✔ |
☃ 对于class的权限修饰只可以用public和default(缺省),且一个类中只能是当前类的类名可以用public修饰
☃ public类可以在任意地方被访问
☃ default(缺省)类只可以被同一个包内部的类访问。
☍ 继承性(extends)
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类功能和属性。
继承的目的和语法
☃ 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中(父类、基类or超类),那么多个类(子类or派生类)拥有与父类相同的属性和行为时无需再定义这些属性和行为,只要继承那个类即可。
![](https://img2020.cnblogs.com/blog/1924746/202003/1924746-20200305095039858-1056343867.png)
继承语法规则
class ChildClass extends SuperClass{
//.....
}
继承的作用
☃ 继承的出现减少了代码冗余,提高了代码的复用性
☃ 继承的出现,更有利于功能的扩展
☃ 继承的出现让类与类之间产生了关系,提供了多态的前提
✦ 不要仅为了获取其他类中某个功能而去继承,要在面向对象的思维上去继承,如轿车不要去继承货车(即使两者拥有部分相同的属性和功能)而是继承车
继承的原则
☃ 子类继承了父类,就继承了父类的方法和属性(非选择性继承)
☃ 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法
☃ 在Java中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”
➥ 子类不能直接访问父类中私有的(private) 的成员变量和方法,通过setter、getter方法和提供的public方法访问(实际上继承到了私有的属性和方法,但由于封装性不能直接调用)
➥ Java只支持单继承和多层继承,不允许多重继承
◌ 一个子类只能有一个父类
◌ 一个父类可以派生出多个子类
◌ 对于多层继承,父类和子类是相对的(直接继承和间接继承)
◌ 多层继承中,子类可以获取直接父类和间接父类(直接父类的父类)的所有属性和方法
![](https://img2020.cnblogs.com/blog/1924746/202003/1924746-20200305100516671-1000981911.png)
☄ 除java.lang.Object类外,其他类都直接或间接继承Object类
练习:
定义父类Circle(圆,包含属性半径,和求圆的面积的方法),子类Cylinder(圆柱,包含高和求体积的方法)继承Circle类,在ExtendsTest类中创建Cylinder对象求圆柱的面积
还可自行创建圆锥类等继承Circle求体积
本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布