Java 向上转型和向下转型的详解

作者:lqh 时间:2022-06-21 08:28:03 

 Java 向上转型和向下转型的详解

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

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

向下转型:父类引用的对象转换为子类类型称为向下转型。

前者是一个向上转型,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,转型
0
投稿

猜你喜欢

  • Android自定义View模仿即刻点赞数字切换效果实例

    2023-08-26 12:45:39
  • android显示TextView文字的倒影效果实现代码

    2022-11-13 00:05:40
  • C#实现顺序表(线性表)完整实例

    2022-06-04 15:42:31
  • 程序员最喜欢的ThreadLocal使用姿势

    2022-10-22 21:14:55
  • 听说用了YYYY-MM-dd的程序员,前些天都在加班改Bug

    2023-07-05 17:48:00
  • C#实现延时并自动关闭MessageBox的方法

    2023-01-19 10:38:51
  • 淘宝IP地址库采集器c#代码

    2022-01-15 22:42:33
  • 详解ThreadLocal为什么会内存溢出原理

    2023-11-09 18:45:26
  • Android编程开发中ListView的常见用法分析

    2022-04-15 09:52:07
  • C#线程入门教程之单线程介绍

    2022-03-15 20:37:28
  • Junit测试多线程无法得到结果的问题解决

    2023-01-01 22:12:52
  • 基于Java实现经典蜘蛛纸牌游戏

    2021-09-06 15:22:57
  • SpringBoot yaml中的数组类型取值方式

    2022-10-14 20:05:36
  • Java IO流之节点流与字符流的相关知识总结

    2021-12-31 06:46:15
  • Spring中的REST分页的实现代码

    2023-03-16 01:06:46
  • springmvc拦截器登录验证示例

    2022-11-28 12:15:24
  • 基于JAVA代码 获取手机基本信息(本机号码,SDK版本,系统版本,手机型号)

    2023-04-04 14:37:43
  • 可空类型Nullable<T>用法详解

    2023-01-19 19:54:28
  • java如何去除图片中的白色背景

    2022-04-17 00:07:14
  • Java面试重点中的重点之Elasticsearch核心原理

    2021-08-03 07:34:16
  • asp之家 软件编程 m.aspxhome.com