您的位置:首页 > 编程语言 > Java开发

Java向上转型和向下转型(多态核心)

2017-04-30 11:13 302 查看
转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。

向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口

向下转型:父类引用的对象转换为子类类型称为向下转型,也称之为强制类型转换。

前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。

转型需要注意的问题:

向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是
4000
在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。

实例如下:

public class Animal {
public void eat(){};
}
class Bird extends Animal{
public void eat(){};
public void fly(){};
}
class Main{
public static void main(String[] args) {
Animal b=new Bird(); //向上转型
b.eat();
b.fly();  //此处提示在Animal中没有定义fly方法。
}


在向下转型过程中,分为两种情况:

情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。

情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。Java 中的instanceof
运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

实例如下:

public class Girl {
   public void smile(){};
}
class MMGirl extends Girl{
   @Override
   public void smile() {};
    public void c(){};
}
class main{
   public static void main(String[] args) {
       Girl g=new Girl();
       //MMGirl mg=(MMGirl)g; //不安全的向下转型,编译无错但会运行会出错
       //mg.smile();
       //mg.c();
       if(g instanceof MMGirl){  // 这里的g就不是他子类的一个实例
         MMGirl mg=(MMGirl)g;
          mg.smile();
         mg.c();
        }
}


总结:

1、父类引用可以指向子类的实例,子类引用不能指向父类的实例。

2、把子类对象直接赋给父类引用叫向上转型,向上转型不用强制转型。

  如Father father = new Son();

3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。

  如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son=(Son)father;其中father前面的(Son)必须添加,进行强制转换,向下转型,用的都是子类的实例,子类的方法有效。

4、 向上转型会丢失子类特有的方法,但是子类overriding
父类的方法,子类方法有效

5、 向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: