java向上转型
首先来了解一下下面的知识点:
,转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。
java属于后期绑定。在java中,几乎所有的方法都是后期绑定的,在运行时去动态的绑定一个方法是属于子类还是属于基类。
向上转型:子类引用的对象转换为父类类型称为向上转型,或者说把子类对象直接赋给父类引用。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口.
Father father = new Son(); //向上转型,父类引用指向子类对象
看下面的代码段1:
public class Father{
public void f1() {
的 method");
}
}
Father的子类Son:
public class Son extends Father {
public void f1() {
的 method"); //覆盖父类的方法@override
}
public void s1(){} //Son类定义了自己的新方法
public static void main(String[] args) {
Father a = new Son();//向上转型
a.fl();
}
}
Father 的 method”还是“Son 的 method”?事实上输出的结果是:Son 的 method 。分析一下,首先Father a = new Son();声明的是父类的引用,但是执行的过程中调用的是子类的对象,所以程序首先寻找子类对象的f1方法,由于子类重写了父类的f1方法,根据“动态绑定”的理论知道程序会去调用子类的f1方法去执行,因为子类对象有f1方法而没有向上转型去寻找。那么我们再接着看下面的一段代码段2:
public class Father{
public void f1() {
的 method");
}
}
Father的子类Son:
public class Son extends Father {
public void s1(){} //Son类定义的方法
public static void main(String[] args) {
Father a = new Son();//向上转型
a.fl();
}
}
Father a = new Son();声明的仍然是父类的引用,执行过程中调用的也仍然是子类的对象,程序首先会去寻找子类对象的f1方法,但是没有找到,于是就会向上转型去父类寻找f1方法,这时会顺利的找到,将会给出的结果是:Father 的 method。
这里我们需要注意,在向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误
但是,值得注意的是在处理java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以找到子类,而对象的属性还是父类的属性。