一.Java中多态的定义
1.体现出多态的前提必须要有子父类关系,或者是类实现接口的关系
2.多态的最终体现就是:父类引用指向子类对象;父类引用调用方法时,如果子类重写了该方法,会调用子类重写后的方法,如若没有重写该方法,会调用父类中的方法(成员方法,在编译时,会检索父类,如果父类中有该方法,编译成功!运行时会优先运行子类重写后的方法)。例:
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:55 2018/04/22 */ public class Father { public void test_01(){ System.out.println("Father"); } }
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:56 2018/04/22 */ public class Son extends Father{ //重写父类的方法 public void test_01() { System.out.println("Son"); } }
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:58 2018/04/22 */ public class Test { public static void main(String[] args){ //父类引用指向子类对象 Father f = new Son(); //使用父类引用调用子类重写后的方法,以下打印结果为Son f.test_01(); } }
注释掉子类重写后的方法,再次调用,如下:
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:56 2018/04/22 */ public class Son extends Father{ //重写父类的方法 /*public void test_01() { System.out.println("Son"); }*/ }
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:58 2018/04/22 */ public class Test { public static void main(String[] args){ //父类引用指向子类对象 Father f = new Son(); //由于子类没有重写该方法,所以调用父类的方法,打印结果为Father f.test_01(); } }
二.成员变量的特点
成员变量,编译的时候检索父类,父类中有,编译成功;运行时,也会运行父类中的成员变量的值,例:
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:55 2018/04/22 */ public class Father { //父类中的成员变量a int a = 100; public void test_01(){ System.out.println("Father"); } }
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:56 2018/04/22 */ public class Son extends Father{ //子类中的成员变量a int a = 1; //重写父类的方法 public void test_01() { System.out.println("Son"); } }
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:58 2018/04/22 */ public class Test { public static void main(String[] args){ //父类引用指向子类对象 Father f = new Son(); //使用父类引用调用成员变量,打印结果为100 System.out.println(f.a); } }
三.instanceof关键字
instanceof是一个比较运算符,判断一个引用类型是否属于某个类型(要有继承或实现关系)的对象,例:
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:58 2018/04/22 */ public class Test { public static void main(String[] args){ //父类引用指向子类对象 Father f = new Son(); //判断f 是否是Father类型的对象,返回的是boolean值,以下打印结果为true boolean b = f instanceof Father; System.out.println(b); } }
四.多态中的向上、下转型
Java中,父类引用指向子类对象,已经做了自动类型提升,将子类 类型提升为父类,这就是向上转型。但有时候,我们要用到子类中特有的方法,就需要向下转型。例:
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:56 2018/04/22 */ public class Son extends Father{ //重写父类的方法 public void test_01() { System.out.println("Son"); } //子类中特有的方法 public void son(){ System.out.println("我是子类"); } }
package com.xiao.variable; /** * @Author 笑笑 * @Date 19:58 2018/04/22 */ public class Test { public static void main(String[] args){ //父类引用指向子类对象 Father f = new Son(); //向下转型,要强制转换 Son s = (Son) f; //子类对象调用子类特有的方法,打印结果为“我是子类” s.son(); } }