49 向上造型与向下造型

向上造型(转型)

定义:超类的引用指向子类对象。

例如:

Animal o1 = new Tiger();//Tiger是Animal的派生类(子类)

  以上即为向上转型。

特性:

  • 向上转型后的引用只能使用超类中的方法和属性。
  • 向上转型后的引用不能使用派生类中自有的方法和属性,可以使用重写父类的方法

向下造型(转型)

将一个已经向上转型的引用强制向下转型,并用一个新的派生类引用接收。

注意:

  • 向下转型后的引用既可以使用超类中的也可以使用它自己的类(当前派生类)中的方法和属性。
  • 向下转型后需要使用一个派生类引用来接收。

以上面的代码为前提,向下转型:

Tiger o2 = null;//先声明一个需要向下转型为的派生类的引用
	if(o1 instanceof Tiger) {//判断当前引用是否指向该派生类的对象
		o2 = (Tiger)o1;//向下转型
		//o1 = (Tiger)o1;//这样是无法转型成功的,转型不会报错,但o1任然无法调用Tiger中的属性和方法
		}

  

案例完整代码

Tiger类向上转型Animal,之后再向下转型Tiger.

package OOday03;
/**
 * 向上转型
 * @author TEDU
 * Animal a1 = new Tiger();
 * 超类的引用a1指向派生类对象new Tiger() 这个就是向上转型
 * a1只能使用超类中的方法,不能使用Tiger中的方法
 */
public class UploadDemo {
	public static void main(String[] args) {
		//向上造型
		System.out.println("--------向上造型------------");
		Animal o1 = new Tiger();
		System.out.println(o1.str1);//向上造型后的o1只能使用超类中的属性
		o1.sayHi();//和方法
		//向下转型
		System.out.println("--------向下造型-----------------");
		Tiger o2 = null;
		if(o1 instanceof Tiger) {
			o2 = (Tiger)o1;
			//o1 = (Tiger)o1;//这样是无法转型成功的,转型不会报错,但o1任然无法调用Tiger中的属性和方法
			//转型后就可以使用派生类的方法了
			System.out.println(o2.str1);//超类中的属性
			o2.sayHi();//超类中的方法
			System.out.println(o2.str2);//派生类中的属性
			o2.sayHello();
		}
		
	}
}
class Animal{
	String str1 = "超类中的属性";
	public void sayHi() {
		System.out.println("超类中的方法");
	}
}

class Tiger extends Animal{
	String str2 = "派生类中的属性";
	public void sayHello() {
		System.out.println("派生类中的方法");
	}
}

  

运行结果:

--------向上造型------------
超类中的属性
超类中的方法
--------向下造型-----------------
超类中的属性
超类中的方法
派生类中的属性
派生类中的方法

  

原文地址:https://www.cnblogs.com/Scorpicat/p/12022543.html