Java 多态性
Java 多态性初探
多态性的依赖: 方法的覆写
class A { public void print() { System.out.println("A") ; } } class B extends A { public void print() { System.out.println("B") ; } } public class TestAB { public static void main(String args[]) { B b = new B() ; b.print() ; } } }
多态性严格描述:
1、 方法的多态性:
a) 方法的重载:同一方法名称,根据传入参数的类型和个数不同载入不同的方法。
b) 方法的覆写:同一个方法,会根据子类的不同实现不同的功能
2、 对象的多态性:指发生在子类中,子类和父类之间的一个转换问题
a) 向上转型【自动完成】:父类 父类对象 = 子类实例
b) 向下转型【强制完成】:子类 子类对象 =(子类)父类实例
实例:向上转型
class A { public void print() { System.out.println("A") ; } } class B extends A { public void print() { System.out.println("B") ; } } public class TestAB { public static void main(String args[]) { A a = new B() ; //向上转型 B b = (B) A ; //向下转型 } } }
上述实例代码,两个均是调用执行B类中被覆写的print方法;因为被new(实例)的是B类,所以就是执行B类的被覆写方法。
向上转型:由于所有的子类对象可以自动的向上转型,所以在于参数的统一上。
class A { public void print() { System.out.println("A") ; } } class B extends A { public void print() { System.out.println("B") ; } } class C extends A { public void print() { System.out.println("C") ; } } public class TestAB { public static void main(String args[]) { // 只要是A类的子类都可以使用向上转型 A a1 = new B() ; A a2 = new C() ; a1.print() ; //执行B.print() a2.print() ; //执行C.print() } }
参数类型统一后,还可以调用子类覆写后的方法体即同一个方法针对不同的子类可以有不同的实现。
【父类和父类对象 不关心子类实例,只关心父类自己的内容,以及调用实例子类的方法。只能看见父类定义的全部方法信息,但是看不见子类自定义的特殊方法信息】
由于参数类型被统一后,可以更好的被链表操作。
向下转型:指的是父类要调用子类自己特殊的方法;发生向上转型后,只能看见父类定义的全部方法信息,但是看不见子类自定义的特殊方法信息;于是此时就需要使用向下转型,将父类对象转换为子类对象,这样就可以使用子类的特殊功能方法
class A { public void print() { System.out.println("A") ; } } class B extends A { public void print() { System.out.println("B") ; } public void funB() { System.out.println("Fun_B") ; } } public class TestAB { public static void main(String args[]) { A a = new B () ; //向上转型并实例化子类new B() B b = (B) a ; //向下转型,B以及实例化 b.funB() ; } }
!! 以上代码可以不使用向上转型,而直接使用子类对象直接实例化 ???
答:
class A { public void print() { System.out.println("A") ; } } class B extends A { public void print() { System.out.println("B") ; } public void funB() { System.out.println("Fun_B") ; } } public class TestAB { public static void main(String args[]) { fun( new B() ) ; } public static viod fun(A a) { //统一参数 // 调用个性化的特征 B b = (B) a ; //因为子类有自己的特殊功能 b.funB() ; } }
多态性转型总结:
- 大多情况下,多数使用向上转型,因为方便我们将各个子类的参数类型统一
- 少数情况下,会使用向下转型,以便调用子类自由的特殊方法 [少用 -- 安全隐患]
- 部分情况下,不使用多态转型
- 子类尽量不要过多的扩充与父类无关的操作方法
- 子类的方法要与父类的方法和功能保持一致!
个性化的操作在一个标准的开发中,应该尽量少出现;因为对象的转型操作中有了强制操作,容易带来安全隐患。
ClassCastException
——(类转换异常)两个没有关系的类对象强制发生向下转型是发生的异常
为了保证类转型的进行,Java中提供关键字“instanceof”,此关键字表示:如果某个对象是某个类的实例,那么就返回true,否则返回false
实例对象 instanceof 类 |
向下转型发生前,一定会先发生向上转型,只有对象和类建立关系后才可以进行向下转型。