问下向下转型作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问下向下转型作用相关的知识,希望对你有一定的参考价值。

我知道向上转型,只可以调用父类方法或者被子类的覆写的方法

可不清楚向下转型到底有什么用?

有意思
向下转型的最终结果是,子类变量的指针指向了父类的实例化对象。简单点讲,就是把爹当儿子用。
比如:此时你想比较一下两个儿子的年龄和体重是否一样。【采用equals方法】
第一,在object父辈继承得来的equals方法,不能完成年龄和体重对比的要求,故要重写
第二,对象那里找呢?子类自身可以new出一个来,剩下的那个只能通过向下转型,把爹变成儿子
呵呵,为了保证变出来的是儿子类的,在变之前就需要采用 出来的对象名称 intanceof 子类名称 筛选一下,这样就获得了两个跟题目要求类型一致的对象。
参考技术A 向上转型是把子类对象当做父类对象。
向下转型是把父类对象当做子类对象。
因为父亲有的,儿子肯定也有。所以可以直接转型。
但是儿子有的,父亲不一定有。所以需要强制转型。
参考技术B 举个例子吧
List list = new ArrayList();
这个就是把list接口声明为一个List类下的一个实现类
也就是你说的向下转型
这样就方便了以后的修改
也就是说敏捷开发过程,以后要修改的话,如下:
List list = new Vector();
List list = new LinkedList();本回答被提问者采纳
参考技术C 向下转型一般适用于面向接口编码编程或工具类。
比如使用spring的依赖注入时经常会用到的
参考技术D 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。
向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口
向下转型:父类引用的对象转换为子类类型称为向下转型。
前者是一个向上转型,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向上转型与向下转型

一、向上转型

例如:Parent p=new Son(); 这样引用p只能调用子类中重载父类的方法;但属性是父类的;如果想调用子类属性的话,可以用getter()方法。

二、向下转型

子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换,例如:Father f1 = new Son();Son s1 = (Son)f1;

以上是关于问下向下转型作用的主要内容,如果未能解决你的问题,请参考以下文章

Java向上转型和向下转型

多态 向上,向下转型

SystemVerilog是否支持向下转型?

Java-泛型的作用

Java向下转型的意义

Java向上转型与向下转型