多态
在java里面对于多态的核心表现主要有以下两点:
1.方法的多态性:
方法的重载:同一个方法名称可以根据参数的类型及个数不同调用不同的方法体;
方法的覆写:同一个父类方发,可能根据实例化的子类不同也有不同的实现,
2.对象的多态性(前提:方法的覆写):
【自动 90%】对象的向上转型:父类 父类对象=子类实例化;
【强制 1%】对象的向下转型:父类 子类对象=(子类)父类实例;
9%是不进行转型,例如:String,
范例:回顾一个简单程序
1 class A{
2 public void print(){
3 System.out.println("【A】");
4 }
5 }
6 class B extends A{
7 public void print(){
8 System.out.println("【B】");
9 }
10 }
11 public class Newbegin{
12 public static void main(String args[]) {
13 B b=new B();//实例化子类对象
14 b.print();//调用被覆写过的方法
15
16 }
17 }
范例:实现向上转型
1 class A{ 2 public void print(){ 3 System.out.println("【A】"); 4 } 5 } 6 class B extends A{ 7 public void print(){ 8 System.out.println("【B】"); 9 } 10 } 11 public class Newbegin{ 12 public static void main(String args[]) { 13 A a=new B();//向上转型 14 a.print();//调用被覆写过的方法 15 } 16 }
不管是发生了向上转型,那么其核心的本质还是在于:你使用了那一个子类(new 在哪里)而后你调用的方法是否被子类覆写了。
向下转型:就是将父类对象变为子类对象,但是在这之前需要明确一个核心概念,为什么需要向下转型?
当你需要使用到子类扩充操作的时候就要使用向下转型。
范例:向下转型
1 class A{ 2 public void print(){ 3 System.out.println("【A】"); 4 } 5 } 6 class B extends A{ 7 public void print(){ 8 System.out.println("【B】"); 9 } 10 public void funB(){//这个方法只有子类有 11 System.out.println("【B】funB方法执行了"); 12 } 13 } 14 public class Newbegin{ 15 public static void main(String args[]) { 16 A a=new B();//向上转型 17 a.print();//调用被覆写过的方法 18 //这个时候父类能够调用的方法只能是自己本类定义好的方法,如果想调用子类的方法,。 19 B b=(B)a;//向下转型 20 b.funB(); 21 } 22 }
如果想要向下转型,就必须要先向上转型,否则转型会出现:ClassCastException
向下转型可能存在隐患,那么就要依靠instanceof关键字来实现了。
instanceof返回的是boolean类型。
范例:观察instanceof的使用
1 class A{ 2 public void print(){ 3 System.out.println("【A】"); 4 } 5 } 6 class B extends A{ 7 public void print(){ 8 System.out.println("【B】"); 9 } 10 public void funB(){//这个方法只有子类有 11 System.out.println("【B】funB方法执行了"); 12 } 13 } 14 public class Newbegin{ 15 public static void main(String args[]) { 16 A a=new B();//实例化父类 17 System.out.println(a instanceof A); 18 System.out.println(a instanceof B); 19 //以后对于子类的特殊操作尽量慎用 20 if(a instanceof B){//避免了ClassCastException的问题, 21 B b= (B)a; 22 b.funB(); 23 } 24 } 25 }
思考一下这种转换,有什么意义?
范例:要求定义一个方法,而这个方法可以接受Person类的所有实例。并调用Person类的方法
1 class Person{ 2 public void takeoff(){//脱 3 System.out.println("脱掉****"); 4 } 5 } 6 class Student extends Person{ 7 public void takeoff(){//脱 8 System.out.println("一件件脱掉****"); 9 } 10 } 11 class Worker extends Person{ 12 public void takeoff(){//脱 13 System.out.println("直接卷了"); 14 } 15 } 16 public class Newbegin{ 17 public static void main(String args[]) { 18 in(new Student()); 19 in(new Worker()); 20 21 } 22 public static void in(Person per){ 23 per.takeoff();//所有人都要进行。 24 }
1.操作参数统一,用向上转型来,对象的多态核心在于方法的覆写
2.通过对象的向上转型可以实现,接收参数的统一,而向下转型可以实现子类扩充方法的调用(一般不操作)
3.两个没有关系的是不能进行转型。会ClassCastException。