对象多态性
基本概念的解释。
多态性的依赖条件是方法的覆写!!
观察如下的一个程序:
class A{ public void print(){ System.out.println("A--print()") ; } } class B extends A{ public void print(){ System.out.println("B--print()") ; } } public class Test{ public static void main(String args[]){ B b = new B() ; b.print() ; } }
输出结果是 B--print() ;
一》》方法的多态性:
(1)方法的重载:同一个方法名称会根据传入参数的类型及个数不同执行不同的方法体
(2)方法的覆写:同一个方法会根据子类的不同实现不同的功能。
二》》对象的多态性:值得是发生在继承关系类之中,子类和父类之间的转换
(1)向上转型:(自动完成)父类 父类对象 = 子类实例;
(2)向下转型:(强制完成)子类 子类对象 = (子类) 父类实例;
范例:
class A{
public void print(){
System.out.println("A--print()") ;
}
}
class B extends A{
public void print(){
System.out.println("B--print()") ;
}
}
public class Test{
public static void main(String args[]){
A a = new B() ; //向上转型
B b = (B) a ;//向下转型
a.print() ;
b.print() ;
}
}
//结果都会输出 B--print();
为什么需要向下转型呢??
对于数据的操作分为两步
1.设置数据 : 最需要的是参数一致的功能
如果有一个方法:
public static void fun(A a){//如果要把B的参数传过来,就需要向上转型。
B b = (B) a ;//此时如果需要调用B类中的个性方法,那么就需要向下转型
}
2。取出数据
向下转型必须发生在向上转型之后操作,如下范例(错误)
class A{ public void print(){ System.out.println("A--print()") ; } } class B extends A{ public void print(){ System.out.println("B--print()") ; } public void fun(){ System.out.println("fun()") ; } } public class Test{ public static void main(String args[]){ A a = new A() ; B b = (B) a ; } }
结果显示
ClassCastException 类转换异常,没有关系的类对线更强制发生向下转型时候发生 的异常。
Java判断类和实例的关系:
1.instanceof
class A{ } class B extends A{ } public class TestDemo{ public static void main(String arg[]){ A a = new B() ; System.out.println(a instanceof A) ; // true System.out.println(a instanceof B) ; // true
if(a instanceof B){ //如果a对象是B的实例化,那么就可以向下转型
B b = (B) a ;
}
如果:
A a = new A() ;
System.out.println(a instanceof A) ; //true
System.out.println(a instanceof B) ; //false
} }
//如果是向上传递,那么,a是A的实例化也是B的实例化