黑马程序员-Java中的子类和父类之间转换的一点心得。

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

编写Java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用的对象确实包含该方法。如果需要让引用变量调用它运行时类型的方法,则必须把它强制类型转换成运行时类型,否则会出现异常错误。

class father {
	public int x;
	public int y;

	public void sayHello() {
		System.out.println("Hello:father");
	}

	public void testfather() {
		System.out.println("testfather");
	}

}

class child extends father {
	public int z;

	@Override
	public void sayHello() {
		// TODO Auto-generated method stub
		System.out.println("Hello:child");
	}

	public void testchild() {
		System.out.println("testchild");
	}
}

public class fathertochild {

	public static void main(String[] args) {
		father fat = new father();
		child chi = new child();
		// 子类传递给父类,实现多态
		fat = chi;
		// fat是指向father的引用,虽然我把chi的引用传给了fat,但fat本质上还是指向father类的
		// 因此fat无法获得chi的新内容
		// 这句编译报错
		// fat.z = 2;
		// 这就是fat在运行时候的多态,fat是指向father的引用,但在运行时候却指向了chi的方法
		// 这句输出Hello:child
		fat.sayHello();

		father fat1 = new father();
		child chi1 = new child();
		// 父类传递给子类,强制类型转换
		// 隐式转换报错
		// chi = fat1;
		// 下面这种强制转换的形式就相当于将一个指向child类的引用chi,强制的指向了被强制转换成child类的father类,chi里面有继承了father的
		// 方法,也有自己实现了的方法,而fat里面并没有实现继承的方法。
		// 强制转换编译器不报错,但是运行时会抛出异常
		// com.itheima.father cannot be cast to com.itheima.child,呵呵说的多明白
		chi1 = (child) fat1;
		// fat1并没有z这个变量,但编译器认为chi是child类,肯定有z,但是运行时找不到z,抛出异常
		// 看看下面这几句代码,把编译器骗的好惨,但实际上根本不可能运行的
		// chi.z = 2;
		// System.out.println(chi.z);

		// chi.sayHello();
		// chi.testchild();
		// chi.testfather();
		// 实际写代码的时候经常看到有人将Object这个父类变来变去,但要知道,Object是所有类的父类,
		// 所以说任何类型都可以赋值给Object
		Object obj = new child();
		father fat3 = (father) obj;
		// 依然输出Hello:chilid
		fat3.sayHello();
		// 下面这段代码依然会抛出类型无法转换异常
		// com.itheima.father cannot be cast to com.itheima.child
		Object obj1 = new father();
		child chi2 = (child) obj1;
		chi2.sayHello();
		// 所以说不要尝试将父类强制转换成子类,也就是所谓的向下转型,这样是不安全的。编译时可以通过,但运行时会发生类型转换错误。
		// 谁也不想在代码变得庞大和复杂以后去找这种小bug吧,呵呵。
	}

}

                                            ---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值