JAVA中的向上转型和向下转型

一、向上转型和向下转型

       向上转型和向下转型是在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 强制类型转换异常

 

如果觉得对你有帮助,点个赞再走吧!

  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值