向上转型与向下转型详解

让我们先来了解一下,怎么用转型。

转型

要转型,首先要有继承。继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展自己的属性及方法。

向上转型: 通过子类对象 (小范围) 实例化父类对象 (大范围) , 这种属于自动转换

  • Father f = new Son();

向下转型: 通过父类对象 (大范围) 实例化子类对象 (小范围) , 这种属于强制转换

  • Son s = (Son) f;
总结:

在这里插入图片描述


向上/下转型示例


向上/下转型示例

思考下面代码:

  • B b = new B() -----> A b = new B(); 为什么要这样做?
  • 向下转型的使用
package exercise;


class Bicycle extends Cycle {
	public Bicycle() {
		// TODO Auto-generated constructor stub
		System.out.println("Bicycle()");
	}

	public void ride() {
		System.out.println("Bicycle ride!!!");
	}

	public void balance() {
		System.out.println("Bicycle-->balance()");
	}
}

class Unicycle extends Cycle {
	public Unicycle() {
		// TODO Auto-generated constructor stub
		System.out.println("Unicyle");
	}

	public void ride() {
		System.out.println("Unicycle ride!!!");
	}

	public void balance() {
		System.out.println("Unicycle-->balance()");
	}
}

class Tricycle extends Cycle {
	public Tricycle() {
		// TODO Auto-generated constructor stub
		System.out.println("Tricycle()");
	}

	public void ride() {
		System.out.println("Tricycle ride!!!");
	}

	// 此处没有balance方法
}

class Cycle {
	public Cycle() {
		// TODO Auto-generated constructor stub
//		System.out.println("Cycle()");
	}

	public void ride() {
		System.out.println("Cycle ride!!!");
	}
}

/***************************************************************************************************/


/***************************************************************************************************/



public class Upcasting {
	public static void ride(Cycle c) {
		c.ride();
	}
	public static void main(String[] args) {
//第一波
		Cycle cycle = new Cycle(); // 没有向上转型
		cycle.ride();
//		cycle.balance();	//Cycle没有balance方法
		Cycle bicycle = new Bicycle();// Upcast
		bicycle.ride();
		((Bicycle) bicycle).balance();// downcast
		Cycle tricycle = new Tricycle();// Upcast
		//((Bicycle) tricycle).balance();
		// 如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错.
		// 但是运行时会出现java.lang.ClassCastException错误。
		System.out.println("=======================================");

//第二波--选中一个向上/向下转型的例子进行讲解		
		// 向上转型
		System.out.println("向上转型");
		Cycle unicycle = new Unicycle();// Upcast
		unicycle.ride();
//		unicycle.balance();	//向上转型之后,则不能调用父类没有而子类有的方法————比如此处给出的balance方法		

		// 此处为不转型
		System.out.println("\n此处为不转型");
		Unicycle unicycle1 = new Unicycle();
		unicycle1.ride();
		unicycle1.balance();
		// WDFC 明明Unicycle unicycle1 = new Unicycle();这样直接来就什么都能调用。
		// 我本来就是要拓展父类才创建的子类,你给我向上转型后,子类拓展方法不能用了,我转型有个屁用???

		// 向下转型
		System.out.println("\n向下转型:"); // 这里先再次强调一下:向下转型需要先向上转型
		((Unicycle) unicycle).balance(); // 向下转型是强制类型的

		// 进入正文,再次WDFC
		// 本来直接new不就好了
		// 转型干什么(向上向下转来转去,一脸懵逼),劳神伤财又费力

		// --------N次学习后
		// 我突然发现,转型实在是太牛批了!
		// 一直以来,都是我的转型例子太简单了,所以看上去转型就是在浪费时间。
		// 请看下面,来一个简单复杂且牛批的代码。
		

//第三波
		System.out.println("\n\n=======================================");
		ride(new Cycle()); // No upcasting
		ride(new Unicycle()); // Upcast
		ride(new Bicycle()); // Upcast
		ride(new Tricycle()); // Upcast
	}
}

返回上层目录


返回目录

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值