(十)JAVA基础学习第十篇章——继承与多态

类的继承性是面向对象语言的基本特性,多态性的前提是继承性。

JAVA中的继承

Java继承使用关键字extends,extends后面跟父类。如果在类的声明中没有使用extends关键字指明其父类,则默认父类为Object类,java.lang.Object类是Java的根类,所有Java类包括数组都直接或间接继承了Object类。
提示:在Java中,一个类只能继承一个父类,但可以实现多个接口。

调用父类构造方法

当子类实例化时,不仅需要初始化子类成员变量,也需要初始化父类成员变量,初始化父类成员变量需要调用父类构造方法,子类使用super关键字调用父类构造方法。
在这里插入图片描述
在这里插入图片描述
在子类中调用父类构造方法初始化,super语句必须位于子类构造方法的第一行。

成员变量隐藏和方法覆盖

成员变量隐藏
当子类成员变量与父类一样时,会屏蔽父类中的成员变量,称为“成员变量隐藏”。但也可以使用super关键字调用。
方法覆盖
如果子类方法完全与父类方法相同,即相同的方法名、相同的参数列表和相同的返回值,只是方法体不同,则子类覆盖父类方法。在子类中声明方法覆盖父类中的方法时添加@Override注解,@Override注解不是方法覆盖必须的,它只是锦上添花,有两个好处:

  1. 提高程序的可读性。
  2. 编译器检查@Override注解的方法在父类中是否存在,如果不存在,则报错。
    注意:方法覆盖时应遵循的原则:
    (1)覆盖后的方法不能比原方法有更严格的访问控制(可以相同)。
    (2)覆盖后的方法不能比原方法产生更多的异常。

多态

多态的概念
发生多态有三个前提条件:
(1)继承。多态发生在子类和父类之间。
(2)覆盖。子类覆盖父类的方法。
(3)声明的变量类型是父类类型,但实例则指向子类实例。例如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
多态发生时,Java虚拟机运行时根据引用变量指向的实例调用它的方法,而不是根据引用变量的类型调用。
引用类型检查
有时候要在运行时判断一个对象是否属于某个引用类型,这时可以使用instanceof运算符。语法如下:
obj instanceof type
其中,obj是一个对象,type是引用类型。如果obj对象是type引用类型实例,则返回true,否则返回false。
引用类型转换
数值类型可以相互转换,引用类型也可以相互转换,但并不是所有的引用类型都能相互转换,只有属于同一棵继承层次树中的引用类型才可以转换。

final关键字

在Java中final关键字的作用很多,final关键字能修饰变量、方法和类。
final修饰变量
final修饰的变量即成为常量,只能赋值一次。但final修饰的局部变量和成员变量有所不同。
(1)final修饰的局部变量必须使用之前被赋值一次才能使用。
(2)final修饰的成员变量在声明时没有赋值叫“空白final变量”。空白final变量必须在构造方法或静态代码块中初始化。
final修饰类
final修饰的类不能被继承。有时出于设计安全的目的,不想让自己编写的类被别人继承,这时可以使用final关键字修饰父类。
final修饰方法 final修饰的方法不能被子类覆盖。有时也是出于设计安全的目的,父类中的方法不想被别人覆盖,这时可以使用final关键字修饰父类中的方法。