java 对象类型转换之父对象转化为子对象

   代码摘抄自《java就业培训教程》——张孝祥老师。

class A{
	public void func1(){
		System.out.println("A func1 is calling");
	}
	public void func2(){
		func1();
	}
}

class B extends A{

	@Override
	public void func1() {
		System.out.println("B fun1 is calling");
	}
	public void func3(){
		System.out.println("B func3 is calling");
	}
	
}
public class C {
	public static void main(String args []){
		A a=new A();       
		callA(a);          //a应用传递给callA 
		callA(new B());    //直接把B对象做为一个A对象传递给函数
	}
	
	public static void callA(A a){
		if(a instanceof B){     //判断a指向的对象类型是否是B类型的
			B b=(B)a;           //因为a指向的对象原来就是B类型的
			b.func1();          //所以,这里可以强制转化,然后真的调用B类型的func3方法
			b.func2();
			b.func3();
		}else{
			a.func1();
			a.func2();
		}
		
	}
}
        简单理一下上面的类型转换过程:在第二个callA()方法时,传递给该方法的是一个B类型的对象。由于callA函数所接收的是一个A类型的对象,所以这里进行了一次类型转化(子类型对象转换为父类型对象)。接下来到了if判断那里,程序判断了一下a指向的对象是不是一个B类型的对象,结果是True,所以执行下面的代码。为了使用传递进来的对象,必须使用该对象的引用,也就是必须使用a,而a本身是A类型的引用,所以必须进行强制类型转化,即 B b=(B) a;这一句。这时相当于新建了一个B类型的引用b,指向了传递进来的B类型的对象。这样就可以使用传进来的对象的所有属性和方法了。

        从上面的过程就能看出来,强制类型转化把父对象转换成子对象,并不是把一个父对象真的补齐了子对象中多出的属性或者方法使之成为一个真正的子对象,而是原本一个子对象的地址由于某种原因赋值给了一个父类的引用后,程序员很明确的知道这个父对象的引用指向的是一个子对象时,才可以使用强制类型转化。

       

阅读更多
个人分类: JAVA
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭