多态
概述:
某一个事物,在不同时刻表现出来的不同状态
举例:
猫 m = new 猫();
动物 d = new 猫();
前提:有继承关系
要有方法重写(可以写,但没有意义)
要有父类引用指向子类对象
父 f = new 子();
多态中的成员访问特点
A、成员变量(用父类的)
编译看左边,运行看左边
B、构造方法
创建子类对象的时候,访问父类构造方法,对父类的数据进行初始化。
public class DuoTaiDemo {
public static void main(String[] args) {
//父类引用指向子类对象
Fu f = new Zi();//(new zi时访问父类构造)
System.out.println(f.num);
//找不到符号,Fu类没有num2
//System.out.println(f.num2);
}
}
class Fu {
public int num = 100;
public void show() {
System.out.println("show Fu");
}
}
class Zi extends Fu {
public int num = 10000;
public int num2 = 200;
public void show() {
System.out.println("show Zi");
}
}
输出:
100
C、成员方法(用子类的)
编译看左边,运行看右边
public class DuoTaiDemo {
public static void main(String[] args) {
//父类引用指向子类对象
Fu f = new Zi();
System.out.println(f.num);
//找不到符号,Fu类没有num2
//System.out.println(f.num2);
f.show();
//f.methood; 父类没有
}
}
class Fu {
public int num = 100;
public void show() {
System.out.println("show Fu");
}
}
class Zi extends Fu {
public int num = 10000;
public int num2 = 200;
public void show() {
System.out.println("show Zi");
}
public void method() {
System.out.println("methood zi");
}
}
输出:
show Zi
D、静态方法(用父类)
编译看左边,运行看左边
(和类相关 算不上重写)
结论:由于成员方法存在重写,所以看右边 子类的
好处:代码的维护性(继承)
代码的扩展性(多态)
弊端:并能使用子类特有的功能。补充(要使用子类功能)
A、创建子类方法即可。不合理,占用太多内存
B、把父类引用强制转换为子类的引用。(向下转型)
Zi z = (Zi) f;
对象间转型问题:
向上转型: Fu f = new zi ();
向下转型: Zi z = (Zi) f; (要求f必须是能够转换为zi的)
案例
1、南北方人
public class DuotaiTest2 {
public static void main(String[] args) {
//南方人
Person p = new SouthPerson();
p.eat();
System.out.println("-----------------");
SouthPerson sp = (SouthPerson)p;
sp.eat();
sp.JingShang();
System.out.println("----------");
//北方人
p = new NorthPerson();
p.eat();
System.out.println("-----------");
NorthPerson np = (NorthPerson)p;
np.eat();
np.YanJiu();
}
}
class Person{
public void eat() {
System.out.println("吃饭");
}
}
class NorthPerson extends Person{
public void eat() {
System.out.println("炖菜,吃馒头");
}
public void YanJiu() {
System.out.println("研究");
}
}
class SouthPerson extends Person{
public void eat() {
System.out.println("炒菜,吃米饭");
}
public void JingShang() {
System.out.println("经商");
}
}
输出:
炒菜,吃米饭
-----------------
炒菜,吃米饭
经商
----------
炖菜,吃馒头
-----------
炖菜,吃馒头
研究
蜀中大雨连绵_
发布了15 篇原创文章 · 获赞 5 · 访问量 603
私信
关注