方法的重载和方法的覆写实际上就是多态性的一种体现;真正的多态性还包含一种称为对象多态性的概念。
主要是:子类和父类对象相互转换关系。
向上转型:子类对象自动转换成父类对象 父类 父类对象=子类实例
向下转型:父类对象需要强制转换成子类对象 子类 子类对象=(子类)父类实例
class A{
public void fun1(){
System.out.println("1、A类 --> public void fun1(){}") ;
}
public void fun2(){
this.fun1() ;
}
};
class B extends A{
public void fun1(){ // 将方法覆写了
System.out.println("2、B类 --> public void fun1(){}") ;
}
public void fun3(){ // 此操作为子类自己定义的,父类中不存在
System.out.println("3、B类 --> public void fun3(){}") ;
}
};
public class PolDemo01{
public static void main(String args[]){
A a = new B() ; // 发生向上转型关系,子类实例 --> 父类实例
a.fun2() ;
}
};
如果要调用fun3()方法,那么要就行向下转型
class A{
public void fun1(){
System.out.println("1、A类 --> public void fun1(){}") ;
}
public void fun2(){
this.fun1() ;
}
};
class B extends A{
public void fun1(){ // 将方法覆写了
System.out.println("2、B类 --> public void fun1(){}") ;
}
public void fun3(){ // 此操作为子类自己定义的,父类中不存在
System.out.println("3、B类 --> public void fun3(){}") ;
}
};
public class PolDemo02{
public static void main(String args[]){
A a = new B() ; // 发生向上转型关系,子类实例 --> 父类实例
B b = (B)a ; // 发生向下转型关系,强制
b.fun3() ;
b.fun2() ;
}
};
有如下代码
A a=new A();
B b=(B)a;
此时a想b转型不成功,因为a与b之间并没有任何关系。
如果想判断对象时哪个类的实例,则使用instanceof关键字
对象 instanceof 类 ->此方法返回boolean类型的数据
为了保证对象的向下转型操作正确,在操作前最好判断此对象是否是类的实例。
首先将子类转换成父类,然后判断对象是否是类的实例,最后将父类强制类型转换成子类。