Java中多态性主要表现在两个方面:方法的重载和覆写和对象的多态性。
对象的多态性主要表现在以下两种类型:
- l 向上转型:子类对象->父类对象 父类 父类对象 = 子类实例;
- l 向下转型:父类对象->子类对象 子类 子类对象 = (子类)父类对象;
1、向上转型:用子类对象转型到父类对象调用的还是子类覆写过得方法,但注意这样的父类对象不能调用父类中没有的方法。此处的父类对象可以使接口。
1 class A{ 2 void print1() { //定义print1 3 System.out.println("父类print1");} 4 } 5 class B extends A{ 6 void print1() { //覆写父类的print1 7 System.out.println("子类print1");} 8 void print2() { 9 System.out.println("子类print2");} 10 } 11 public class Test{ 12 public static void main(String args[]) { 13 A a = new B(); 14 a.print1(); //此处调用覆写过得print1 15 } 16 }
2、向下转型过程中,分为两种情况:
情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。
1 class A{ 2 void print1() { //定义print1 3 System.out.println("父类print1"); 4 5 } 6 } 7 class B extends A{ 8 void print1() { //覆写父类的print1 9 System.out.println("子类print1"); 10 } 11 void print2() { 12 System.out.println("子类print2"); 13 } 14 } 15 public class Test{ 16 public static void main(String args[]) { 17 A a = new B(); //转型成功 18 B b = (B)a; 19 // A a = new A(); //转型失败 20 // B b = (B)a; 21 b.print1(); 22 } 23 }