多态
一、概述:
- 某一个事物,在不同时刻表现出来的不同状态。多态是同一个行为具有多个不同表现形式或形态的能力。
- 举例:水的不同状态(液体,固体,气态)。
多态是同一个行为具有多个不同表现形式或形态的能力。
多态性是对象多种表现形式的体现。例如:
- 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫、小狗、蜥蜴等等。那么我到宠物店说"请给我一只宠物",服务员给我小猫、小狗或者蜥蜴都可以,我们就说"宠物"这个对象就具备多态性。
- 比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白色的酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:
酒 a = 剑南春
酒 b = 五粮液
酒 c = 酒鬼酒
…
这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。
二、多态存在的三个必要条件(多态的前提)
- 继承(有继承关系)
- 重写(方法重写)
- 父类引用指向子类对象
class Fu {
public void show() {
System.out.println("show Fu"); //2.方法重写
}
}
class Zi extends Fu { //1.继承关系
public void show() {
System.out.println("show Zi");
}
}
class DuoTaiDemo {
public static void main(String[] args) {
//父 f = new 子();
Fu f = new Zi(); 3.要有父类引用指向子类对象
}
}
三、 多态中的成员访问特点:
A:成员变量
编译看左边,运行看左边。
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法
编译看左边,运行看右边。
D:静态方法
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)
用代码演示如下:
1、构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
class Fu {
//构造方法
public Fu(){} //默认,可以不写
public void show() {
System.out.println("show Fu"); //2.方法重写
}
}
class Zi extends Fu { //1.继承关系
public void show() {
System.out.println("show Zi");
}
}
class DuoTaiDemo {
public static void main(String[] args) {
//父 f = new 子();
Fu f = new Zi(); 3.要有父类引用指向子类对象
}
}
2、成员变量:编译看左边,运行看左边。
class Fu {
public int num = 100;
public void show() {
System.out.println("show Fu");
}
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 200;
public void show() {
System.out.println("show Zi");
}
}
class DuoTaiDemo {
public static void main(String[] args) {
Fu f = new Zi();
//System.out.println(f.num); //100
System.out.println(f.num2); //找不到符合
}
}
DuoTaiDemo.java:21: 错误: 找不到符号
System.out.println(f.num2); //找不到符合
^
符号: 变量 num2
位置: 类型为Fu的变量 f
1 个错误
3、成员方法
编译看左边,运行看右边。
class Fu {
public int num = 100;
public void show() {
System.out.println("show Fu");
}
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 200;
public void show() {
System.out.println("show Zi");
}
public void method() {
System.out.println("method zi");
}
}
class DuoTaiDemo {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num); //100
//f.show();//show Zi
f.method();// 找不到符号
}
}
DuoTaiDemo.java:27: 错误: 找不到符号
f.method();// 找不到符号
^
符号: 方法 method()
位置: 类型为Fu的变量 f
1 个错误
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
由于成员方法存在方法重写,所以它运行看右边。
4、静态方法
编译看左边,运行看左边。 (静态和类相关,算不上重写,所以,访问还是左边的)
class Fu {
public int num = 100;
//静态方法
public static void function() {
System.out.println("function Fu");
}
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 200;
//静态方法
public static void function() {
System.out.println("function Zi");
}
}
class DuoTaiDemo {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num); //100
f.function();
}
}
100
function Fu