java系列6:多态(Polymorphism)

解决了程序的扩展问题。

一、方法覆盖(方法重写)

1、方法覆盖(方法重写)

在类的继承体系结构中,如果子类中出现了与父类中有同原型的方法,那么认为子类中的方法覆盖了父类中的方法(也称为方法重写);

通过子类的实例调用被覆盖的方法时,将总是调用子类中的方法,而父类中的方法将被隐藏。

java系列6:多态(Polymorphism)_第1张图片
举例

2、方法覆盖(方法重写)和方法重载的区别

  • 方法覆盖出现的前提条件之一是必须有继承发生的情况下,而且要求父类和子类中的方法必须同原型;
  • 方法重载时,继承并不是必需的,它只要求方法名称相同,而参数列表则必须不同,换言之,各方法的原型其实是不同的。
java系列6:多态(Polymorphism)_第2张图片
方法重载
java系列6:多态(Polymorphism)_第3张图片
方法覆盖/重写
java系列6:多态(Polymorphism)_第4张图片
方法重载
java系列6:多态(Polymorphism)_第5张图片
方法重写

二、引用转型

基类的引用可以指向派生类的对象,如:

BaseClass obj = new DerivedClass();

但是派生类的引用则不可以指向基类的对象,如:

DerivedClass obj = new BaseClass();
这样的语句将引发错误。
java系列6:多态(Polymorphism)_第6张图片
示例

三、多态

同一个对象,使用方法体现出不同的结果。
同一个实现接口,使用不同的实例而执行不同操作。

父类的引用指向哪个类的实例就调用哪个类中的方法;
同样是使用父类的引用,调用同一个名称的方法,却可以得到不同的调用结果,这就是Java中的多态,即:同一函数,多种形态。

java系列6:多态(Polymorphism)_第7张图片

1、静态多态(方法重载)

  • 静态多态也称为编译时多态,即在编译时决定调用哪个方法;
  • 静态多态一般是指方法重载;
    只要构成了方法重载,就可以认为形成了静态多态的条件;
  • 静态多态与是否发生继承没有必然联系。

2、动态多态(方法重写)

  • 动态多态也称为运行时多态,即在运行时才能确定调用哪个方法;
  • 形成动态多态必须具备以下条件:
    1.必须要有继承的情况存在;
    2.在继承中必须要有方法覆盖;
    3.必须由基类的引用指向派生类的实例,并且通过基类的引用调用被覆盖的方法;

由上述条件可以看出,继承是实现动态多态的首要前提。

3、抽象类和接口


四、final关键字

final:最终的,不可修改的。

java系列6:多态(Polymorphism)_第8张图片
final修饰变量、方法和类

1、final修饰变量

如果将某个变量修饰为final,那么该变量就成为常量,常量在声明时必须初始化。
一般语法:

[访问权限] final 数据类型 常量名 = 值;

final double PI = 3.14159;
PI成为常量,其后任何试图对PI进行赋值的语句都将报错;

2、final修饰方法

如果将某个成员方法修饰为final,则意味着该方法不能被子类覆盖。如果在派生类中出现同原型的方法,将会报错。
一般语法:

[访问权限] final 返回值类型 方法名(参数列表) {
    ……
}

public final void fun() {
    ……
}

3、final修饰类

如果将某个类修饰为final,则说明该类无法被继承,任何类想继承于该类都将报错。
一般语法:

[访问权限] final class 类名 {
    成员列表
}

public final class MyClass {
    ……
}

你可能感兴趣的:(java系列6:多态(Polymorphism))