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中向上转型和向下转型

转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。 向上转型:子类引用的对...
  • DaHeMaDeGeGe
  • DaHeMaDeGeGe
  • 2016年02月22日 09:58
  • 1202

重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)

多态,大概每个人都知道。但是,又有几个人真的理解什么是多态、多态有哪些细节呢?如果你看到这篇文章的名字,脑海中对多态没有一个清晰的概念,不妨点进来看看,也许会有收获。...
  • qq_31655965
  • qq_31655965
  • 2017年01月26日 21:25
  • 8900

Java向上转型和向下转型(附详细例子)

Java向上转型和向下转型(附详细例子) 熬夜整理的关于Java向上和向下转型的例子,非常的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Anim...
  • u010093630
  • u010093630
  • 2014年08月01日 02:13
  • 11211

JAVA笔记-多态的意义(向上转型与向下转型)

多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。 编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出...
  • Java_Chuck
  • Java_Chuck
  • 2016年07月02日 11:09
  • 3739

关于向上转型与向下转型的一点个人见解

正是大四实习期间,看李兴华老师的Java教学视频再打打基础时,就遇见向上转型与向下转型的问题,向上转型倒是通过视频看懂了,向下转型那一段看了好多遍都没懂,上网查资料,也大多一语带过,最后看了《Java...
  • qq_33448733
  • qq_33448733
  • 2016年03月18日 11:00
  • 1558

Java多态 向上转型 向下转型

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

向上转型和向下转型

向上转型和向下转型: 向上转型(upcasting) instanceof关键字 该关键字判断一个变量的数据类型是否是某类型或其子类型,这样能保证向下转型时不会出错 同时会做编译时和运行时的检...
  • hephec
  • hephec
  • 2014年11月25日 12:53
  • 1036

java面向对象之向上转型和向下转型

转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。 向上转型:子类引用的对...
  • liu136313
  • liu136313
  • 2016年03月08日 16:42
  • 606

面向对象_多态中向上转型和向下转型

/* 多态的弊端: 不能使用子类的特有功能。 我就想使用子类的特有功能?行不行 行。 怎么用呢? A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了...
  • L1585931143
  • L1585931143
  • 2016年10月05日 22:51
  • 1706

java中向上转型(upcast)和向下转型(downcast)

先看下面的程序:class Useful { int value = 20;public void f() {System.out.println("f() in the Useful class")...
  • zhu_apollo
  • zhu_apollo
  • 2007年11月26日 21:46
  • 9380
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的向上转型和向下转型
举报原因:
原因补充:

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