Java面向对象三大特性-封装、继承、多态

在讲Java面向三大特性之前,我们先了解一下访问修饰符的访问范围:

(1):private:同类中具有访问权限。

(2):protected:本类 和同包以及不同包的子类才具有访问权限。

(3):public:统一工程中都具有访问权限。

(4):默认 本类和同包范围内具有访问权限。

一、Java面向对象三大特性之封装。

封装就是将类的某些信息隐藏在类的内部,不允许外部程序直接访问,外部程序需要通过该类提供的方法对隐藏的信息进行访问。(比如将类的属性私有化,通过提供的get 、set方法对私有化的属性进行操作)。

封装的好处:外部程序只能通过特定的方法访问数据,确保数据的安全。隐藏类内部实例细节,方便修改和实现。

二、Java面向对象三大特性之继承(extends)

2.1、概念:继承实际上就是一种“is-a”的关系。比如说:运动类和羽毛球运动的关系。羽毛球运动是运动的一种,所以我们可以说 羽毛球运动是运动类(is-a)。这里的运动类是羽毛球运动的父类或者基类。羽毛球运动是运动的派生类或者叫做子类。

语法规则:子类 extends 父类。

如:public class  BadmintonSport extends Sport{

}

2.2、继承的好处:1):子类可以继承父类除private修饰的属性和方法以及构造器外的所有方法和属性。实现了代码的复用。

      2):方法的重写,子类可以根据自身业务需求,对父类继承过来的方法进行重写。方法重写后,调用时候就会优先调用子类的方法。

2.3、继承的坏处:基类发生变动所有子类都跟着一起变动。依赖性强。

2.4、继承的初始化问题。

  1):当我们实例化子类对象的时候,Java程序的执行顺序是这样的:父类对象的属性初始化=======》父类对象的构造方法初始话=====》子类对象属性初始化=====》子类对象构造方法初始化。

  2):子类在构造的过程中必会调用父类的构造方法。如果我们没有显式的在子类中调用父类的构造方法,则默认调用父类的午无参构造方法。

  3):在子类中显式的调用父类的构造方法时候,调用必须是在子类构造方法中的第一行,否则会报错。

  4):注意:如果我们没有在子类构造 方法中显式调用父类的某个构造方法而父类中又没有无参构造方法,则代码会报错。

2.5、Java中的继承都是单继承。

三、Java面向对象三大特性之多态。

根据我们上面对继承的讲解,我们知道一个类可能有多个子类,不同的子类的具体实现方法都封装在不同的类中,当我们要使用的时候必须要强制转换成相应的类型,才能调用对应的方法去实现。如果一个类具有多个子类的时候,我们如果都要这样做的话,会出现很多冗余的代码,使程序变的繁琐。从代码优化角度看,这肯定不是最优的。性能也不是最好的。那么这个问题如何去解决呢?利用Java多态就能解决这个问题。

多态的概念:不同的事物对同一行为具有不同的 形态。

例:

从程序运行上看,Animal(父类)的引用指向Dog、Cat(子类)的实例,动物都有吃饭和跑的行为,但是每种动物吃的东西和跑的方式可能不同,我们需要将某种动物具体的这种行为进行复写,不同的实例调用体现出不同的结果。这就是多态的一种体现。

  2):多态实现的必要条件:继承或者实现接口、方法重写、父类引用指向子类对象(向上转型)

  3):向上转型的有点:继承使我们知道该类是父类的扩展,子类能提供比父类更强大的功能,我们定义一个指向子类对象的父类引用,这样我们不仅可以使用父类的共性外,还能使用子类更强大的功能。

  4):虽然向上转型能使我们不仅可以使用父类的共性还能使用子类的扩展,但是向上转型也存在一定的缺陷,比如:向上转型会导致某些属性和方法的缺失,导致我们不能引用他们,也就是说:父类引用只能调用父类具有的属性和方法,对于那些在子类中特有的方法是不能够调用的

从运行结果看,我们可以看出,先是执行狗的run()方法,然后执行的是父类Animal 的eat()方法,为什么呢?因为我们在子类中重写了Animal 的run()方法,这个方法就是Dog类特有的,所以父类引用ad是不能调用的,而我们Animal的eat方法在Dog子类是没有重写的,所以ad调用的是父类的eat()方法。

  

猜你喜欢

转载自www.cnblogs.com/Tom2-xiao-ye/p/9906671.html