Java向上转型
通俗理解向上转型:
就是子类转型成父类。
class A{}
class B extends A { }
A b = new B();
这个就是向上转型。
向上转型可以像下面这条语句这么简单:
Shape s =new Circle();
这里,创建一个Circle对象,并把得到的引用立即赋值给S矇,这样做看似错误(将一种类型赋值给别一种类型);但实际上没有问题,因为通过继承,Circle就是一种Shape。因此,编译器认可这条语句,也就不会产生错误信息。
假设你调用一个基类方法(它已经在导出类中被覆盖);
s.draw();
你可能再次认为调用的是Shape的draw();因为这毕竟是一个Shape引用,那么编译器是怎样知道去做其它的事情呢?由于后期绑定(多态),还是正确调用了Circle.draw()方法。
总结
1、通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
DerivedC c2=new DerivedC();
BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类
a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法
分析:
* 为什么子类的类型的对象实例可以覆给超类引用?
自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型BaseClass;
* a.play()将执行子类还是父类定义的方法?
子类的。在运行时期,将根据a这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。
在a1=c2的时候,仍然是存在两个句柄,a1和c2,但是a1和c2拥有同一块数据内存块和不同的函数表。
2、不能把父类对象引用赋给子类对象引用变量
BaseClass a2=new BaseClass();
DerivedC c1=a2;//出错
在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行。
c1=(DerivedC)a2; 进行强制转化,也就是向下转型.
3、记住一个很简单又很复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量。
你可能说这个规则不对的,因为父类引用指向子类对象的时候,最后执行的是子类的方法的。
其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。而假若子类的这个
相关文档:
先看一段代码
public class Hello{
public static void main(String[] args){
int i = 5 , j = 2;
System.out.println(i+j);
System.out.println(i-j);
& ......
2009年9月出版的。同是《软件开发课堂》系列。本人在本书中编写的章节为:
第12章:多线程
第13章:IO流
第15章:反射
第16章:注解
第19章:网络编程
第20章:项目实例之网络版QQ
图书封面:
购买链接:http://www.china-pub.com/195979&ref=ps ......
浅谈Java泛型编程
1 引言在JDK 1.5中,几个新的特征被引入Java语言。其中之一就是泛型(generics)。泛型(generics,genericity)又称为“参数类型化(parameterized type)”或“模板(templates)”,是和继承(inheritance)不同而互补的一种组件复用机制。继承和泛型的不同之处在于&mda ......
抽象化和继承关系使概念和定义可以复用;多态性使实现和应用可以复用;
开闭原则(Open-Closed Principle OCP)一个软件实体应当对扩展开放,对修改封闭。
对可变性的封装原则(Principle of Encapsulation of Variation) (1)一种变化性不和另一种混合在一起 (2)一种可变性不应散落在代码的很多地方。
里氏代换 ......
一、背景
最近一年多来,在Internet上出现的特别吸引人的事件就是Java语言和用Java编写的浏览器HotJava。
1991年,SUNMicroSystem公司的JameGosling、BillJoe等人,为在电视、控制烤面包箱等家用消费类电子产品上进行交互式操作而开发了一个名为Oak的软件(即一种橡树的名字),但当时并没有引起人们的注意,直到1 ......