Java面向对象的三大特征:封装、继承和多态的详解

时间:2022-04-21 00:01:11
什么是封装?
1、把对象的状态和行为看成一个统一的整体,将二者存放在一个独立的模块中(类);
2、“信息隐藏”,把不需要让外界知道的信息隐藏起来,尽可能隐藏对象功能实现细节,向外界暴露方法,
保证外界安全访问功能,把所有的字段使用private私有化,不准外界访问;把方法使用public修饰,允许外界访问。
把所有数据信息隐藏起来,尽可能隐藏多的功能,只向外暴露便捷的方法,以供调用。

封装的好处:
1、使调用者正确、方便的使用系统功能,防止调用者随意修改系统属性。
2、提高组件的重用性;
3、达到组件之间的低耦合(当某一个模块实现发生变化时,只要对外暴露的接口不变,就不会影响到其他模块)。

封装如何暴露和隐藏呢?
访问权限控制:

private:表示私有的,表示类访问权限,只能在本类中访问,离开本类之后,就不能直接访问;
不写(缺省):表示包私有,表示包访问权限,访问者的包必须和当前定义类的包相同才能访问;
protected:表示子类访问权限,同包中的可以访问,即使不同包,但是有继承关系,也可以访问;

public:表示全局的,可以公共访问权限,如果某个字段/方法使用了public修饰,则可以在当前项目中任何地方访问。

Java面向对象的三大特征:封装、继承和多态的详解







什么是继承关系:
基于某个父类对对象的定义加以拓展,而产生新的子类定义,子类可以继承父类原来的某些定义,也可以增加原来父类所没有的定义,或者覆写父类中的某些特性。

从面向对象的角度上说:继承是一种从一般到特殊的关系,是一种“is a”的关系,即子类是对父类的拓展,是一种特殊的父类,比如:狗是动物的一种特殊情况,狗属于动物。

在Java中,类和类之间的继承关系只允许单继承,不允许多继承。但是Java允许多重继承

在Java中除了Object类之外,每一个类都有一个直接的父类,
       比如:class Student extends Person{}
我们就说此时Student的直接父类是Person。

那么class Person{},此时的Person的父类又是谁?
Object类是Java语言的根类(老祖宗,任何类都是Object的子类)
class Person{}就等价于class Person extends Object{}
Object类要么是一个类的直接父类,要么是一个类间接父类。


继承关系的作用:
1)解决了代码的重复问题;
2)真正的作用,表示出一个体系。


子类继承了父类的哪些成员(根据访问修饰符来判断):

1)如果父类中的成员使用public修饰,子类继承;
2)如果父类中的成员使用protected修饰,子类也继承,即使父类子类不在同一个包;
3)如果父类和子类在同一个包中,此时子类可以继承父类中缺省修饰符的成员;
4)如果父类中的成员使用private修饰,子类打死都继承不到,因为private只能在本类中访问;
5)父类的构造器,子类也不能访问,因为构造器必须和当前的类名相同。






多态:(当我们代码变成以下样子时,多态就产生了)
Animal d = new Dog();
Animal c = new Cat();

Dog和Cat都是Animal的子类。


对象d和c具有两种类型:
编译类型:
声明对象变量的类型,Animal,表示把对象看成什么类型;
运行类型:对象的真实类型,Dog或Cat,运行类型对象的真实类型。
编译类型必须是运行类型的父类,或相同。
当编译类型和运行类型不同的时候,多态就出现了。

所谓多态:对象具有多种形态,对象可以存在不同的形式。
多态的前提:可以是继承关系(类和类)/也可以是实现关系(接口和实现类),在开发中多态一般指第二种。
多态的特点:把子类对象赋给父类变量,在运行时期会表现出具体的子类特征。

多态的作用:当把不同的子类对象都当做父类类型来看待,可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码达到通用编程,以适应需求的不断变化。


同样的建议多打代码实现一下,记忆更深!