一、在介绍多态之前,首先介绍一个重要的知识点——Java引用变量的类型
Java中引用变量有两个类型:
1、编译时类型,由声明该变量时使用的类型决定;
2、运行时类型,由实际赋给该变量的对象决定;
在编译时类型与运行时类型不一致时,就可能出现——多态
二、什么是多态
多态就是“多种形态“;在程序运行过程中才决定用哪个方法,多态性是允许你将父类对象设置成和它的一个或多个子对象相等的技术,赋值后,父对象就可以根据当前赋值给它的子对象的特性运作,即为多态。
多态是面向对象编程领域的核心概念。(面向对象三大特性:封装,继承,多态)
注意:重载方法在编译期间就确定了,是静态的;方法重载与多态无关,真正与多态相关的是重写(覆盖Override);
三、向上转型
子类是一种特殊的父类,Java中允许把一个子类对象直接赋给一个父类引用变量,无需类型强制转换,就被称为向上转型,这个过程是由系统自动完成的。
四、多态产生的必要条件
1、要有继承
2、要有重写(覆盖Override)
3、子类对象赋给父类引用变量(父类引用指向子类对象)
五、多态代码实例
package com.java.test;
class Father {
public String name = "father";
//父类基本方法
public void fatherMethod()
{
System.out.println("父类的基本方法!");
}
//被子类覆盖方法
public void overrideMethod()
{
System.out.println("父类被子类覆盖方法!");
}
}
public class Child extends Father{
public String name = "child";
//子类基本方法
public void childMethod()
{
System.out.println("子类基本方法!");
}
//子类覆盖父类方法
public void overrideMethod()
{
System.out.println("子类覆盖父类方法!");
}
public static void main(String[] args)
{
//下面编译时类型与运行时类型相同,不存在多态
Father father = new Father();
System.out.println(father.name);
father.fatherMethod();
father.overrideMethod();
System.out.println();
//下面编译时类型与运行时类型相同,不存在多态
Child child = new Child();
System.out.println(child.name);
child.childMethod();
child.overrideMethod();
System.out.println();
//下面编译时类型与运行时类型不同,多态发生
//父类引用指向子类对象,多态发生条件齐全
//father2对象编译时类型是FatherClass,运行时类型是ChildClass
Father father2 = new Child();
//注意:与方法不同,对象的Field不具备多态性,下面输出的是父类的name
System.out.println(father2.name);
father2.fatherMethod();
//多态发生,此处调用的是子类重写的方法
father2.overrideMethod();
}
}