对象类型的转换

来源:互联网 发布:centos升级kde 编辑:程序博客网 时间:2024/05/20 05:28

1、向上转型;

因为平行四边形是特殊的四边形,也就是说平行四边形是四边形的一种,那么就可以将平行四边形对象看作是一个四边形的对象。
可以使用下面的实例表示平行四边形与四边形的关系:
例1、在项目中创建Parallelogram类,再创建Quadrangle类,并使用Parallelogram类继承Quadrangle类,然后再主方法中调用父类的draw()方法;

class Quadrangle { // 四边形类    public static void draw(Quadrangle q) { // 四边形类中的方法        // SomeSentence    }}public class Parallelogram extends Quadrangle { // 平行四边形类,继承了四边形类    public static void main(String args[]) {        Parallelogram p = new Parallelogram(); // 实例化平行四边形类对象引用        draw(p); // 调用父类方法    }}

这里一直在强调一个问题,就是平行四边形也是一种类型的四边形,所以可以将平行四边形类的对看作是一个四边形的对象,这就是相当于“Quadrangle obj =new parallelogram()”就是把子类对象赋值给父类类型的变量,这种技术被称为“向上转型”,试想一下正方形类对象可以作为draw()方法参数,梯形类对象同样也可以作为draw()方法的参数,如果在四边形类的draw()方法中根据不同的图形对象设置不同的处理,就可以做到在父类中定义一个方法完成各子类的功能,这样可以使同一份代码毫无差别地运用到不同类型之上,这就是多态机制的基本思想。

将子类对象看作父类对象被称为“向上转型”,由于向上转型是从一个交具体的类到较抽象的类的转换,所以它总是安全的,如可以说平行四边形是特殊的四边形,但不能说四边形是平行四边形;

2、向下转型;

向下转型是将较抽象的类转换为较具体的类,这样的转型通常会出现问题。例如:不能说四边形是平行四边形的一种、所有的鸟都是鸽子等,可以说子类对象总是父类的一个实例,但父类对象不一定是子类的实例。

修改上述案例将四边形类对象赋予平行四边形类对象,来看一下在程序中如何处理这种情况;

例2、修改例1 ,在parallelogram类的主方法中将父类Quadrangle的对象赋值给子类Parallelogram的对象的引用变量将使程序产生错误。

class Quadrangle { // 四边形类    public static void draw(Quadrangle q) { // 四边形类中的方法        // SomeSentence    }}public class Parallelogram extends Quadrangle { // 平行四边形类,继承了四边形类    public static void main(String args[]) {    draw(new Parallelogram());    //将平行四边形类对象看作是四边形对象,称为向上转型操作;    Quadrangle q = new Parallelogram();    //Parallelogram p=q;    //将父类对象赋予子类对象,这种写法是错误的;    //将父类对象赋予子类对象,并强制转换为子类型,这种写法是正确的;    Parallelogram p = (Parallelogram)q;    }}

从例2中可以看到,如果将父类对象直接赋予子类,会发生编译器错误,因为父类对象不一定是子类的实例。

越是具体的对象具有的特性越多,越抽象的对象具有的特性越少。在做向下转型操作时,将特性范围小的对象转换为特性范围大的对象肯定会出现问题,所以这时需要告知编译器这个四边形就是平行四边形,将父类对象强制转换为某个子类对象,这种方式称为显示类型转换;