一、向上转型和向下转型
向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点:
1.这是继承过程中发生的操作
2.新类是现有类的一种类型。这种说法主要是因为现有类的方法必定存在于新类中,所以通过现有类发送的信息(就是通过创建一个对象进行操作)可以直接通过新类发送。
二、向上转型
向上转型:创建一个基类的引用,但是在创建对象的时候是用的导出类的。示意图如下:
由图可知:由导出类转型成基类,在继承图上是向上移动的。同时由于是从较专用类型向较通用类型转换,所以是安全的,因为专用类型肯定包含通用类型。
特点:
1.把导出类对象直接赋给基类类引用,不用强制转换
2.引用可以直接使用基类中的方法,但是不能使用导出类的方法
3.从导出类向上转型,永远不需要知道正在处理的对象的确切类型
4.在向上转型过程中可能发生类接口中方法丢失
示例 :
class Fupcasting{
public Fupcasting(String ident) {
System.out.println("i am " + ident);
}
public void count() {
}
}
public class Upcasting extends Fupcasting{
public Upcasting(String ident) {
super(ident);
// TODO Auto-generated constructor stub
}
public void add() {}
public static void main(String[] args) {
String name = "fatherupcasting";
// TODO Auto-generated method stub
Fupcasting fupcasting = new Upcasting(name); //向上转型
fupcasting.count();
//fupcasting.add(); //使用导出类的方法报错
}
}
三、向下转型
向下转型可以参照向上转型,二者正好相反。这里使用向下转型的原因是因为上述的向上转型的第三条的关系:从导出类向上转型,永远不需要知道正在处理的对象的确切类型!
解释如下:
可知:导出类可以完全代替基类,在使用它们的时候,完全不需要知道关于子类的任何信息。
这里如果你清楚 引用和对象 的概念,你就会明白,当我们在向上转型的时候,你处理的导出类的对象你完全不清楚确切类型,这里的类型可以是 基类,也可以是导出类,也就是这一步:
Fupcasting fupcasting = new Upcasting(name);
你也可以写成这样:
Fupcasting fupcasting = (Fupcasting)new Upcasting(name);
或者这样:
Fupcasting fupcasting = (Upcasting)new Upcasting(name);
这里的 (Upcasting) 和 (Fupcasting) 都声明了我们创建的对象的类型,但是在向上转型的过程中我们是这样做的:
Fupcasting fupcasting = new Upcasting(name);
通过上面的步骤我们知道我们并不清楚这个对象是什么类型的,所以如果在一定的情况下要获取类型信息,就会用到向下转型!
向下转型示意图:
借用上面的shape图,如果现在我们知道有一个几何图形,但是我们不清楚它是圆、正方形等,但是它的形状肯定是唯一确定的。
实例:
class Fupcasting{
public Fupcasting(String ident) {
System.out.println("i am " + ident);
}
public void count() {
}
}
public class Upcasting extends Fupcasting{
public Upcasting(String ident) {
super(ident);
// TODO Auto-generated constructor stub
}
public void add() {}
public static void main(String[] args) {
String name = "fatherupcasting";
// TODO Auto-generated method stub
// Fupcasting fupcasting = (Upcasting)new Upcasting(name); //向上转型
// fupcasting.count();
//fupcasting.add(); //使用导出类的方法报错
Upcasting upcasting = (Upcasting) new Fupcasting(name); //向下转型
upcasting.add();
}
}
特点:
1.向下转型可以调用子类类型中所有的成员
2.父类引用对象指向的是子类对象,那么在向下转型的过程中是安全的,就是编译是不会出错误。但是如果父类引用对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会 出现 Java 强制类型转换异常
如果觉得对你有帮助,点个赞再走吧!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)