Java的三大特性(封装,继承,多态)

时间:2021-02-07 21:55:22

一、Java的三大特性(封装,继承,多态)

a) 封装

        面向对象程式设计中,封装(Encapsulation)就是把类的内部与外界隔离起来,把实现数据和方法的包装(隐藏),防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过特定的方式。

        举个例子,你现在在用电脑(手机)看这篇文章,然而你在使用电脑(手机)的时候并不需要理解电脑(手机)内部是怎么样构成的,你只需要对其作出输入(点击)就可以了。相当于黑箱(百度百科:黑箱理论

封装的好处:

1.  因为内部的数据方法等全部被隐藏隔离起来,外部只能对其做有限的访问,提高了安全性。

2.  提高程序维护性,开发者只要保证其外部特征不变(输入输出等与外部的交互方式不变)就可以随便的修改和维护内部的程序结构和逻辑。

例如,你写了一个类,向类的对象输入XY,实现X+Y的运算,你内部的运算逻辑是X*1+Y(当然不会有人这么写,例子而已);这时你写了另外一个类(外部)引用了前面那个类的对象并传入X=1Y=1,这时输出为2;这时你发现你写的第一个类可以改进,你把X*1+Y改成了X+Y,此时这个类已经被改动了,但是其外部特征还是没有变,还是输入XY,输入X+Y,所以外部类对其的引用不会受到影响。

3. 提高了代码的复用性(模块化);如上例子,你可以在调用了该类的情况下,随时使用实现加法运行,不需要重新写其类内部的所有代码。

b) 继承

        继承是所有OOP语言和Java语言不可缺少的部分。当创建一个类时,总是在继承,除非已经明确声明继承某个类,不然默认继承Java的标准根类Object。

        继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

        如:鸟都有翅膀等。鹰、麻雀、蜂鸟都是鸟类,它们就有鸟的特征,有翅膀等,那么就可以说鸟是父类,而鹰、麻雀、蜂鸟都是继承了鸟这个父类的子类。

 

继承的声明是通过 extends 关键字声明,如下:

class 父类 {}

class 子类 extends 父类{ }

 

这里需要注意的是:

1.  在Java中,只支持单继承,如果实现多继承的功能可以采用接口以及对内部类的使用。

2.  子类拥有父类非private的属性,方法。(private是父类私有的)

3.  子类可以拥有自己的属性和方法。(如上面例子中,鹰有“食肉”这个自己的属性等)

4.  提高了类之间的关系(子类与父类之间)。对比封装的说明,封装似乎是降低类之间的关系,更加模块化,而继承带来无法避免的小缺点是提高了类之间的关系。


super关键字

说到继承,就一定要简单提下super关键字。

在子类中可以用super(),super.方法,super.变量名和对象名。

super():调用父类构造方法(构造方法在下文有介绍)。

super.方法名:直接访问并调用父类中的某个方法。

super.变量名和对象名:直接访问父类中的变量或对象。

 

c)  多态

        其实在上文描述继承的时候,就有多态的体现了,鸟类的子类却有多种形态,这就是多态的表现。

可见,继承是多态的条件之一,而多态的另外两个条件:Override(重写、覆盖)、父类引用可以指向子类对象。

1.  Override(重写、覆盖)

父类中允许被继承的方法在子类中被重新编写。方法名、返回值和参数都不能变化,被重新编写的是方法内部。

如下,eat就被重写了

class父类 {

public void eat(){

System.out.println(“吃两碗饭”);

}

}

class 子类 extends 父类{

public void eat(){

System.out.println(“吃一碗饭”);

}

public void run(){

System.out.println(“跑步”);

}

}

2.  父类引用可以指向子类对象

        子类继承父类之后,子类相当于对其做了扩充改进,但是父类和子类之间是存在共性。所以定义父类类型的引用指向子类,即父类 父类对象 = new 子类构造方法(子类对象),而这个引用只能调用父类中定义的方法和变量,如果子类重写了父类的方法,那么父类调用这个方法时,将会调用重写后的方法,不能调用子类自己独有的方法。

 

多态的体现主要有两个方面:1、方法的重载和重写。2、对象的多态性。

1. 方法的重载在构造函数介绍中已经说明,而重写在上文有介绍。

2. 对象的多态性

对象的多态性主要体现在:

a)对象向上转型:子类转为父类,如上文中的父类引用指向子类对象,

             即 父类 父类对象 = 子类对象

b)对象向下转型:父类转为子类,即子类 子类对象 = (子类)父类对象,这个过程需要强转。

多态的优点:1.可替换性(重写)2.可扩充性(子类拥有自己的方法)3.接口性(向子类提供了相同的接口,由子类完善)4.灵活性(实现多样化的操作)5.简化性(提高代码复用性,简化了编写过程)

 

二、 抽象(abstract)

由abstract修饰的类和方法,称为抽象类和抽象方法。

        抽象可以理解为是一个概念,不可以用一个具体的实例来描述,其实现必须由子类和子类的重写来实现。引用上面鸟类的例子,如我们定义鸟类为父类,那么鸟类会叫会吃,但是叫是怎么叫什么声音的叫,吃是吃什么,并没有说明,只是一个抽象的笼统的说明,也无法创建一个实例。那我们就可以把鸟类成为抽象类,其中的叫和吃为抽象方法。例程如下:

public abstract class Bird{

public abstract String voice();

public abstract Stringeat();

public Booleanfly(){}

}

1. 抽象类

如上例程,可以知道使用abstract修饰类来定义一个抽象类。

抽象类的特点:

1.抽象类不能直接实例化,必须依靠子类来实例化。

2.抽象类必须有子类,不然抽象类没有意义,而且一个子类只能继承一个抽象类。

3.子类必须重写抽象类中的所有抽象方法

4.抽象类中也可以存在非抽象方法、也可以不包含抽象方法

 

2. 抽象方法

如上例程,可以知道使用abstract修饰方法来定义一个抽象方法。

抽象方法的特点:

1一个类包含抽象方法,那么这个类一定是抽象类。

2子类必须重写父类的抽象方法,或者声明自身也是抽象类。

3抽象类中的抽象方法只是声明,并不存在具体方法体。

4构造方法、static修饰的方法不能定义为抽象方法。


转载地址 https://blog.csdn.net/Rany_w/article/details/79879449