本文主要详细介绍Java向上转换和向下转换的相关信息。有需要的朋友可以参考一下。
Java 向上转型和向下转型的详解
转换是基于继承的,继承是面向对象语言中代码重用的一种机制。通过继承,子类可以重用父类的功能。如果父类不能满足当前子类的需求,子类可以重写父类中的方法进行扩展。
向上转型:子类引用的对象到父类类型的转换称为向上转换。通俗地说,就是把子类对象变成父对象。这里的父类对象可以是一个接口。
向下转型:父类引用的对象到子类类型的转换称为向下转换。
前者是向上转化,动物狗引用指向new Dog();作为父类对象,子类只能调用父类的成员。如果子类覆盖了父类的方法,就会根据这个引用指向被子类覆盖的方法(这个方法就是override)。这个调用过程被称为“动态绑定”。
改造中需要注意的问题:
当父类指向子类的引用对象时,会丢失父类共有的其他方法,即在转换过程中,子类的新方法会丢失,系统会提供编译时找不到方法的错误。
例子如下:
公共类动物{
public void eat(){
System.out.println('动物进食.');
}
}
类鸟延伸动物{
public void eat(){
System.out.println('吃鸟.');
}
公共void fly(){
System.out.println('鸟在飞.');
}
}
主类{
公共静态void main(String[] args) {
动物b=新鸟();//向上转换
b . eat();
b . fly();//这里有个提示,Animal中没有定义fly方法。
}
在向下转型过程中,分为两种情况:
情况一:如果父类引用的对象是指向的子类对象,那么在向下转换的过程中是安全的。也就是编译不会有错误。
情况二:如果父类引用的对象是父类本身,那么在向下转换的过程中是不安全的。编译时不会出现错误,但运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免错误之类的错误。
实例如下:
公共课女生{
public void smile(){
System.out.println('少女微笑().');
}
}
MMGirl类扩展女孩{
@覆盖
public void smile() {
System.out.println('女孩的微笑听起来很甜美.');
}
公共void c(){
System.out.println('MMirl c(). ');
}
}
主类{
公共静态void main(String[] args) {
girl G1=new mm girl();//向上转换
G1 . smile();
mm girl mmg=(mm girl)G1;//向下变换,编译运行不会有错误。
mmg . smile();
mmg . c();
少女g2=新少女();
//mm girl mm G1=(mm girl)G2;//不安全的向下转换,编译无错但运行有错。
//mm G1 . smile();
//mmg 1 . c();
MMGirl的g2实例){
mm girl mm G1=(mm girl)G2;
mm G1 . smile();
mm G1 . c();
}
}
总结:
1.父类引用可以指向子类对象,但子类引用不能指向父类对象。
2.将子类对象直接赋给父类引用称为向上转换,向上转换不需要强制转换。
如父亲父亲=新儿子();
3.将指向子类对象的父类引用赋给子类引用称为向下转换,需要强制转换。
例如,父亲是指向子类对象的父类引用,那么将父亲赋给子类引用儿子,即儿子儿子儿子=(儿子)父亲;
必须在父亲前面加上(儿子)进行强制转换。
4.向上转换将丢失子类的唯一方法,但是子类覆盖父类的方法,并且子类是有效的。
5.向上转换的作用,减少重复代码。父类是参数,有时子类作为参数,即使用向上变换。这使得代码简洁。体现了JAVA的抽象编程思想。
感谢您的阅读,希望能帮到您,也感谢您对本站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。