多态

多态

概述:

某一个事物,在不同时刻表现出来的不同状态

举例:

​ 猫 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 私信 关注
上一篇:对ARM加载域和运行域的理解(ARM程序是怎么运行的)


下一篇:Java学习之多态---类成员变化