Java中的向上转型和向下转型

原创 2015年11月20日 10:55:55

我感觉向上转型就是把小的东西放在大的东西里面,不会衣橱,当然是安全的,例如:Father  f = new Son();

父亲的体积小,儿子的体积大,现在把父亲放在一个容量更大的东西中,当然能放下;

向下转型就就是:大的东西放在小的东西里面,需要强转,例如:Father f = new Son();  Son  s = (Son) f;一句话说完就和doule ,int 类型相互转换的规则是一样的


转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口向下转型:父类引用的对象转换为子类类型称为向下转型。前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。转型需要注意的问题:向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。实例如下:

public class Animal 

{         public void eat()

{                   System.out.println("animal eatting...");        

 }

}

class Bird extends Animal

{         public void eat(){                  

 System.out.println("bird eatting...");      

   }       

  public void fly(){                  

 System.out.println("bird flying...");        

 }

}

class Main{               

public static void main(String[] args) { 

                  Animal b=new Bird(); //向上转型                  

                 b.eat();        

                  b.fly();  //此处提示在Animal中没有定义fly方法。

 }

在向下转型过程中,分为两种情况:情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。实例如下:

public class Girl {       

  public void smile(){                 

  System.out.println("girl smile()...");        

 }

}

class MMGirl extends Girl{                   

@Override         

public void smile() { 

                                    System.out.println("MMirl smile sounds sweet...");       

  }         

public void c(){                   

System.out.println("MMirl c()...");        

 }

}

class main{                   

public static void main(String[] args) {  

                 Girl g1=new MMGirl(); //向上转型                   

g1.smile();                   

MMGirl mmg=(MMGirl)g1;    //向下转型,编译和运行皆不会出错               

    mmg.smile();                  

 mmg.c();                

   Girl g2=new Girl();          

 //MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错           

//mmg1.smile();         

  //mmg1.c();                 

  if(g2 instanceof MMGirl){                            

MMGirl mmg1=(MMGirl)g2;                           

 mmg1.smile();                           

 mmg1.c();                 

  }       

  }

总结:1、父类引用可以指向子类对象,子类引用不能指向父类对象。2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。   如Father father = new Son();3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。   如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;   其中father前面的(Son)必须添加,进行强制转换。4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。

相关文章推荐

java向上转型向下转型

  • 2012年09月04日 10:44
  • 19KB
  • 下载

JAVA的向上转型与向下转型(二)

java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。 什么叫父类引用指向子类对象,且听我慢慢道来. 从2个名词开始说起:向上转型(upcasting) 、向下转型(downcas...

Java多态 向上转型 向下转型

封装、继承、多态是面向对象的三大特征,在Java中什么是多态? Java引用变量有两种类型,分别是编译时类型和运行时类型。何为编译时类型,编译时类型就是由声明该变量时使用的类型决定,而运行时类...

JAVA中的向上转型与向下转型

一、向上转型。通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。1,向上转型中的方法调用。看下面代码:package com.wensefu.others; public class An...

java向上转型和向下转型

java向上转型和向下转型 (转载:http://hnwsha.i.sohu.com/blog/view/177489975.htm) 转型是在继承的基础上而言的,继承是面向对象语...

Java向上转型与向下转型(good)

Java向上转型与向下转型(good)
  • dingxy
  • dingxy
  • 2011年02月11日 09:37
  • 2032

java的向上转型和向下转型

java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。 什么叫父类引用指向子类对象,且听我慢慢道来. 从2个名词开始说起:向上转型(upcasting) 、向下转型(dow...
  • lcb1992
  • lcb1992
  • 2016年11月08日 11:32
  • 113

JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制

JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制   向上转型(upcasting):对象可以作为它本身的类型使用也可以作为它父类(基类)对...

【java】向上转型和向下转型

java:子类对象向上转型为父类实例后,调用的是父类方法,还是子类方法? 当子类重写了父类方法,向上造成后调用的是子类方法; 子类没有重写父类方法,向上造型后调用的是父类方法。 package...

[Java] 关于向上转型 向下转型

[Java] 关于向上转型 向下转型
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的向上转型和向下转型
举报原因:
原因补充:

(最多只允许输入30个字)