----------------------android培训、java培训、期待与您交流! ----------------------
1)在java中允许用一个父类类型的变量引用一个子类对象,这叫把子类当做父类用,向上转型反之,不能用子类变量引用父类对象
原因: 父类有的子类一定有,子类有的父类不一定有
2) 子类当父类用注意的问题:
访问成员变量是静态绑定,即在编译阶段就和父类的成员变量绑定了,这样按理是不对的,考虑到通常成员变量会私有,此点不予以考虑
访问成员方法是动态绑定,即在编译阶段不和任何方法绑定,程序运行期间,虚拟机会根据变量指向的对象的具体类型类决定到底调用哪一个方法
虽然父类变量指向的是子类对象,但是不能调用子类有而父类没有的方法,编译器报错,原因是,动态绑定发生在运行阶段,编译器只负责检查语法,发现父类没有该方法,编译不通过,此时需要强制类型转换
强制类型转换
在确定父类变量引用子类对象时,可以将父类变量的值给一个子类类型变量,需要显示声明类型转换
容易导致类型转换异常java.lang.ClassCastException
最好在强制类型转化之间用 instanceof 判断一下
// 打字员
public cl ass Typist {
public void type() {
System.out.println("Typisttype");
}
}
// 程序员继承打字员
public class Coder extends Typist {
// 覆写 type 方法
public void type() {
System.out.println("Codertype()");
}
public void code() {
System.out.println("Codercode()");
}
}
public class Demo {
public static void main(String[] args) {
Typist typist = newCoder();// 将一个子类实例当做父类类型
//根据typist变量找到指向的对象,根据对象的类型来决定调用哪个类的 type 方法, 动态绑定
typist.type();
//typist.code();编译无法通过
// 变量类型在运行期间是毫无意义的, 因为就是某个对象的引用
// 但是编译器是根据变量的类型来检查语法的
// 对象是子类,可以调用子类方法的, 但是当做父类用的时候,编译器无法识别
// 此时,需要强制类型转
Coder coder = (Coder)typist;
coder.code();
System.out.println("-------------------------");
//Typist typist1 = newTypist();
Typist typist1 = newCoder();
//类型强制转换容易导致类型转换异常java.lang.ClassCastException
// 最好的做法,加判断
// instanceof用于判断变量指向的对象是否为某种类型的对象
if(typist1 instanceof Coder){
Coder coder1= (Coder) typist1;
coder1.code();
}
Typist t = newItcast().getTypist();
}
}
----------------------android培训、java培训、期待与您交流!----------------------
详细请查看:http://edu.csdn.net/heima