「Java为什么要向下转型」java为什么要用向下转型

博主:adminadmin 2023-01-04 22:51:08 884

今天给各位分享Java为什么要向下转型的知识,其中也会对java为什么要用向下转型进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何理解java中的向下转型

Java里只有两种,一种是向上转型,一种是向下转型,其实原理都是一样的.

比如

人(People)

继承了

动物

这个类(Animal)

则向上转型代表

把子类赋值给父类

Animal

a

=

new

People();

向下转型则将父类的引用还原成实际的子类

People

p

=

(People)

a;

但是向下转型一定要是实际的子类,否则会报错.

比如现在多了一个

猴子(Monkey)

继承

动物类

之前

a

是通过

new

People()

得来的

但是向下转型的时候是不能转为猴子的,否则会报类转换异常.

Monkey

m

=

(Monkey)

a;

这样是会报错的.

用我们的语言其实也好理解,比如

人是属于动物,但是人不属于猴子,反之亦然,猴子也不属于人,但是是动物

java当中向上向下转型的作用是什么?向下转型的语法?

向上转型和向下转型涉及到面向对象三大特性之一的继承,也就是子类和父类之间的关系。

这里以 父类 动物(Animal) 和子类 狗(Dog) 为例:

向上转型:顾名思义,就是把子类强转为父类。代码 Animal a = new Dog();

注意,这里的a是没有办法执行Dog类的独有方法的,因为JVM认为a 是Animal类型的。如果需要使用Dog类独有的方法,就要使用向下转型,也就是通俗意义上的强转。

向下转型:就是把父类强转为子类,代码:

Animal a = new Dog();

Dog d = (Dog)a; // 向下转型,这种写法是完全正确的

/** 下面这种写法会报错 */

Animal a = new Animal();

Dog d = (Dog)a; // 这里会报错,无法转换。

报错的原因很简单,因为你可以说狗是动物,但是你无法说动物是狗。

写了这么多,希望你能明白

java中为什么要用向下转型

向下转型一般在泛型中使用比较多。

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

java中向上转型和向下转型有何用途

无论是上转还是下转都是为了让类的使用范围和适用范围发生变化,以便操作不同范围的变量或者方法。

1上转型是指将子类对象使用父类引用进行引用。

得:上转型对象可以操作和使用子类继承或者重写的方法。

失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。

2与向上转型相反,即是把父类对象转为子类对象:作用也与上转相反。

java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。子类和父类中定义同名的变量时,仅仅是隐藏了,变量没有多态性;而对于覆盖的方法,Java表现出多态性,会调用更具体的子类里面的方法,无论从哪里调用,无论使用什么引用类型调用。

java向下转型,有啥作用。求解

向下转型

将超类的引用强制转换为子类类型就叫做向下转型。

注意:将超类的引用赋给为子类类型的变量(没有进行显示地强制转换)是一个编译

错误。

例子:

还是上面的for循环代码

for(int i=0;ix.length;i++)

{

if(x[i] instanceof MoreUseful2) // 判断instanceof左边的对象是否是右边的类的实例。

{

MoreUseful2 moreuseful2 = (MoreUseful2)x[i]; // 向下转型

moreuseful2.u();

}

x[i].g();

}

分析:x[i]可以代表具体的Useful对象类型,当它是MoreUseful2或ExtendsMoreUseful2

对象类型时,就可以调用该对象的额外方法u(),v(),w(),也就是当对象x[i]和Moreusful对

象存在is-a关系时,才可以进行向下转型,如果要转换的对象类型与指定的对象类型不

存在is-a关系时,会产生一个ClassCastException异常。

总之:

向下转型时,对象只能强制转换为其本身类型或者其超类类型。比如,

当x[i]ExtendsMoreUseful2对象时,可以把他转换为其本身ExtendsMoreUseful2对象类

型,也可以把它转换为其基类MoreUseful2类型。但是在编译时候还不知道这个x[i]是代

表那个具体对象类型只知道这个x[i]是基类类型引用,所以要用这样的形式" (想要要得

到的类型)x[i] " 进行转换。x[i]在这里是就我这个例子来说明的,你也可以使用其它的

英文代替,其意义是一切符合规定的需要被转换的对象。

下面还有个关于向上转型和向下转型的例子,

abstract class ClassAbstract1{}

class ClassDerived1 extends ClassAbstract1

{

public void play1()

{

System.out.println("play1() is in the ClassDerived1");

}

}

abstract class ClassAbstract2{public abstract void play2();}

class ClassDerived2 extends ClassAbstract2

{

public void play2()

{

System.out.println("play2() is in the ClassDerived2");

}

}

public class E14_UnCast {

public static void playDemo1(ClassAbstract1 ObjectParameter)

{

((ClassDerived1)ObjectParameter).play1();//向下转型,可以调用导出类中的扩展方法

}

public static void playDemo2(ClassAbstract2 ObjectParameter)

{

ObjectParameter.play2();//向上转型,可以调用导出类中的覆盖方法

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

ClassAbstract1 classabstract = new ClassDerived1();

playDemo1(classabstract);

ClassAbstract2 classabstract2 = new ClassDerived2();

playDemo2(classabstract2);

}

}

运行结果:

play1() is in the ClassDerived1

play2() is in the ClassDerived2

Java为什么要向下转型的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java为什么要用向下转型、Java为什么要向下转型的信息别忘了在本站进行查找喔。