「Java为什么要向下转型」java为什么要用向下转型
今天给各位分享Java为什么要向下转型的知识,其中也会对java为什么要用向下转型进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、如何理解java中的向下转型
- 2、java当中向上向下转型的作用是什么?向下转型的语法?
- 3、java中为什么要用向下转型
- 4、java中向上转型和向下转型有何用途
- 5、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为什么要向下转型的信息别忘了在本站进行查找喔。