JavaSE面向对象的三大特性(下)---继承与多态

面向对象的第二大特征:继承。

  • 继承的主要作用在于,在已有基础上继续进行功能的扩充。

在java中继承使用关键字extends来实现。

范例:继承的基本实现。

通过上述代码可以发现,当发生了类继承关系之后,子类可以直接继承父类的操作,可以实现代码的重用。子类最 低也维持和父类相同的功能。子类同时也进行了功能的扩充。

继承的主要作用是对类进行扩充以及代码的重用

  • 继承的限制

子类对象在进行实例化前一定会首先实例化父类对象。默认调用父类的构造方法后再调用子类构造方法进 行子类对象初始化。

范例:观察子类对象的创建

以上代码我们发现,没有任何一条语句调用父类构造方法,但是父类的构造方法还是执行了。因此,子类对象实例化之前一定先实例化父类对象。

注意:实际上在子类的构造方法之中,相当于隐含了一个语句 super(); 同时需要注意的是,如果父类里没有提供无参构造,那么这个时候就必须使用super()明确指明你要调用的父类构造 方法。

java只允许单继承,不允许多继承(即一个类只能有一个父类)。但是java允许多层继承。

在进行继承的时候,子类会继承父类的所有结构。(包含私有属性、构造方法、普通方法)但是需要注意的是,所有的非私有操作属于显示继承(可以直接调用),所有的私有操作属于隐式继承(通过 其他形式调用,例如setter或getter)。

范例:显示继承与隐式继承

此时父类中的属性的确被子类所继承了,但是发现子类能够使用的是所有非private操作,而所有的private操作无法 被直接使用,所以称为隐式继承(用setter和getter方法获取)。

继承总结:

1. 继承的语法以及继承的目的(扩展已有类的功能,使代码重用)

2. 子类对象的实例化流程:不管如何操作,一定要先实例化父类对象。

3. 不允许多重继承,只允许多层继承。

  • 覆写(override)

如果子类定义了与父类相同的方法或属性的时候,这样的操作就称为覆写。

  • 方法的覆写(重要)

方法的覆写:子类定义了与父类方法名称、参数类型及个数完全相同的方法。但是被覆写不能够拥有比父类更为严 格的访问控制权限。

范例:简单的覆写

判断当前方法调用的是哪个类的方法:

a.当前使用的对象是通过哪个类new的。

b.调用的方法是否被子类所覆写,如果被覆写,则调用的一定是子类覆写后的方法。

 

在进行方法覆写的时候,有明确的要求:被覆写不能够拥有比父类更为严格的访问控制权限。

访问控制权限:  private(私有访问权限) < default(包访问权限) < public(共有访问权限)

 

问题:如果现在父类方法使用private定义,子类中使用public覆写,对吗?

面试题:请解释重载(overload)和覆写(override)的区别。

  • 属性的覆写(了解)

当子类定义了和父类属性名称完全相同的属性的时候,就成为属性的覆盖。

  • super关键字

  • super调用父类方法

a.super调用父类的构造方法。   super(参数列表)

     当在子类中调用父类的无参构造时,super()可写可不写。

      当子类调用父类的有参构造时,super(参数列表)必须写,告知编译器调用的是父类的哪个有参构造。

b.super调用父类的普通方法        super.方法名(参数列表)

  • super表示父类属性

super是子类访问父类的操作,而this 是本类的访问处理操作。

Q:super与this的区别。

 

  • final关键字

  • final修饰类

当一个类被final关键字修饰后,表示该类不允许被继承,同时,该类中的所有方法都会被隐式加上final关键字(不包含成员变量)

String类以及八大数据类型包装类(eg:Integer)都是final类  -----保护性,封装

  • final修饰方法

当一个方法被final修饰后,表示该方法不允许被覆写

final方法常用于模板方法  -----保护性

  • final修饰属性

当属性被final修饰后,表示该属性值不可变。并且该属性的变量要在声明时初始化

   a.final修饰基本数据类型变量

        初始化的三种:(1)声明时初始化

                                 (2)构造方法中初始化

                                  (3)构造块中初始化

  类中的常量一般使用final+static,描述全局变量  。   

  b.final修饰引用数据类型变量

 

总结final的重要知识点

1、final关键字可以用于成员变量、本地变量、方法以及类。

2、 final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。

3、 不能对final变量再次赋值。

4、 final方法不能被重写。

5、 final类不能被继承。

6、 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用 this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。

 

  • 面向对象的第三大特征:多态

概念:同一个类实例的相同方法在不同的情形下有不同的表现形式。

在Java中,对于多态的核心表现主要有以下两点:

1. 方法的多态性:

①方法的重载:同一个方法名称可以根据参数的类型或个数不同调用不同的方法体

②方法 的覆写:同一个父类的方法,可能根据实例化子类的不同也有不同的实现。

2. 对象的多态性【抽象类和接口才能体会到实际用处】(前提:方法覆写):

【自动,90%】①对象的向上转 型:父类 父类对象 = 子类实例。

【强制,1%】②对象的向下转型:子类 子类对象 = (子类)父类实例。

 

范例:向上转型

不管是否发生了向上转型,核心本质还是在于:你使用的是哪一个子类(new在哪里),而且调用的方法是否被子 类所覆写了。

向下转型指的是将父类对象变为子类对象。

但在这之前我们需要明确:为什么我们需要向下转型?当你需要子类扩 充操作的时候就要采用向下转型。

范例:向下转型

注意:并不是所有的父类对象都可以向下转型 :如果要想进行向下操作之前,一定要首先 发生向上转型,否则在转型时会出现ClassCastException。

问题:如果向下转型存在安全隐患,那么如何转型才靠谱呢?

最好的做法就是先进行判断,而后在进行转型,那么 就可以依靠instanceof关键字实现。

关键字语法如下: 子类对象 instanceof 类,返回boolean类型

对象的向上转型有一个最为核心的用途:操作参数统一。

 

多态性总结:

对象多态性的核心在于方法的覆写。

通过对象的向上转型可以实现接收参数的统一,向下转型可以实现子类扩充方法的调用(一般不操作向下 转型,有安全隐患)。

两个没有关系的类对象是不能够进行转型的,一定会产生ClassCastException。

猜你喜欢

转载自blog.csdn.net/Sun_GLL/article/details/84106333