让我们先来了解一下,怎么用转型。
转型
要转型,首先要有继承。继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展自己的属性及方法。
向上转型: 通过子类对象 (小范围) 实例化父类对象 (大范围) , 这种属于自动转换
- 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
}
}