1.1 多态概述
多态是继封装、继承之后,面向对象的第三大特性。
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
1.2 多态的定义与使用格式
多态的定义格式:就是父类的引用变量指向子类对象
父类类型 变量名 = new 子类类型();
变量名.方法名();
A:普通类多态定义的格式
父类 变量名 = new 子类();
如:class Fu {}
class Zi extends Fu {}
//类的多态使用
Fu f = new Zi();
B:抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类();
如:abstract class Fu {
public abstract void method();
}
class Zi extends Fu {
public void method(){
System.out.println(“重写父类抽象方法”);
}
}
//类的多态使用
Fu fu= new Zi();
C:接口多态定义的格式
接口 变量名 = new 接口实现类();
如: interface Fu {
public abstract void method();
}
class Zi implements Fu {
public void method(){
System.out.println(“重写接口抽象方法”);
}
}
//接口的多态使用
Fu fu = new Zi();
1.2.1 案例代码五:
package com.itheima_01;
/*
* 多态的前提:
* 子父类的继承关系
* 方法的重写
* 父类引用指向子类对象
*
* 动态绑定:运行期间调用的方法,是根据其具体的类型
*
*
*
*
*/
public class PoymorphicDemo {
public static void main(String[] args) {
/*Cat c = new Cat();
c.eat();*/
//父类引用 Animal a
//指向 =
//子类对象 new Cat()
Animal a = new Cat();
a.eat();
}
}
class Animal {
public void eat() {
System.out.println("吃东西");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
}
1.1 多态成员的特点
A:多态成员变量
当子父类中出现同名的成员变量时,多态调用该变量时:
编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。
运行时期:也是调用引用型变量所属的类中的成员变量。
简单记:编译和运行都参考等号的左边。编译运行看左边。
B:多态成员方法
编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败。
运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法。
简而言之:编译看左边,运行看右边