---------------------- 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