00043_多态的概述
1、多态概述
(1)多态是继封装、继承之后,面向对象的第三大特性;
(2)Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person;
(3)Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值;
(4)最终多态体现为父类引用变量可以指向子类对象;
(5)多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态;
(6)在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
2、多态的定义与使用格式
(1)多态的定义格式:就是父类的引用变量指向子类对象
父类类型 变量名 = new 子类类型(); 变量名.方法名();
(2)普通类多态定义的格式
父类 变量名 = new 子类();
class Fu {} class Zi extends Fu {} //类的多态使用 Fu f = new Zi();
(3)抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类(); 如: abstract class Fu { public abstract void method(); } class Zi extends Fu { public void method(){ System.out.println(“重写父类抽象方法”); } } //类的多态使用 Fu fu= new Zi();
(4)接口多态定义的格式
接口 变量名 = new 接口实现类(); 如: interface Fu { public abstract void method(); } class Zi implements Fu { public void method(){ System.out.println(“重写接口抽象方法”); } } //接口的多态使用 Fu fu = new Zi();
(5)注意事项
同一个父类的方法会被不同的子类重写。在调用方法时,调用的为各个子类重写后的方法;
Person p1 = new Student(); Person p2 = new Teacher(); p1.work(); //p1会调用Student类中重写的work方法 p2.work(); //p2会调用Teacher类中重写的work方法
当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。
(6)多态-成员的特点
多态出现后会导致子父类中的成员变量有微弱的变化。
1 class Fu { 2 int num = 4; 3 } 4 class Zi extends Fu { 5 int num = 5; 6 } 7 class Demo { 8 public static void main(String[] args) { 9 Fu f = new Zi(); 10 System.out.println(f.num); 11 Zi z = new Zi(); 12 System.out.println(z.num); 13 } 14 }
当子父类中出现同名的成员变量时,多态调用该变量时:
编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败;
运行时期:也是调用引用型变量所属的类中的成员变量;
简单记:编译和运行都参考等号的左边。编译运行看左边。
多态出现后会导致子父类中的成员方法有微弱的变化。
1 class Fu { 2 int num = 4; 3 void show() { 4 System.out.println("Fu show num"); 5 } 6 } 7 class Zi extends Fu { 8 int num = 5; 9 void show() { 10 System.out.println("Zi show num"); 11 } 12 } 13 class Demo { 14 public static void main(String[] args) { 15 Fu f = new Zi(); 16 f.show(); 17 } 18 }
多态成员方法
编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败;
运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法;
简单记:编译看左边,运行看右边。