本帖最后由 mytongyong 于 2014-7-18 07:20 编辑
- 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吧,呵呵。
- }
- }
复制代码 |