《java入门第一季》之面向对象(多态向下转型)

上一篇博客(http://blog.csdn.net/qq_32059827/article/details/51328638)最后对多态的弊端做了显示,这里解决这个弊端。如下:

/*
	多态的弊端:
		不能使用子类的特有功能。
		
	我就想使用子类的特有功能?行不行?
		行。
		
	怎么用呢?
		A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
		B:把父类的引用强制转换为子类的引用。(向下转型)
		
	对象间的转型问题:
		向上转型:
			Fu f = new Zi();
		向下转型:(容易出现问题)
			Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。类型要匹配
			
			不可行案例:Ren r = (cat) Cat();猫转成人显然不可能的。
*/
class Fu {
	public void show() {
		System.out.println("show fu");
	}
}

class Zi extends Fu {
	public void show() {
		System.out.println("show zi");
	}
	
	public void method() {
		System.out.println("method zi");
	}

}

class DuoTaiDemo4 {
	public static void main(String[] args) {
		//测试
		Fu f = new Zi();
		f.show();
		//f.method();//找不到符号,父类中没有method()
		
		//创建子类对象,可以,但是很多时候不合理。而且,太占内存了
		//Zi z = new Zi();
		//z.show();
		//z.method();
		
		Zi z = (Zi)f;//注意格式哦!
		z.show();
		z.method();
	}
}

既然向下转型也会出现问题,接下来就演示一个出问题的向下转型问题。(这个问题是因为语法不规范导致的)

/*
	ClassCastException:类型转换异常
	一般在多态的向下转型中容易出现
*/
class Animal {
	public void eat(){}
}

class Dog extends Animal {
	public void eat() {}
	
	public void lookDoor() {
	
	}
}

class Cat extends Animal {
	public void eat() {
		
	}
	
	public void playGame() {
		
	}
}

class DuoTaiDemo5 {
	public static void main(String[] args) {
		//内存中的是狗
		Animal a = new Dog();
		System.out.println(a);
		Dog d = (Dog)a;//向下转型了
		System.out.println(d);
		
		//内存中是猫
		//Animal a = new Cat();Animal a记住不可以这样定义。错误: 已在方法 main(String[])中定义了变量 a。个人理解的是发生变量赋值“冲突”
        //(希望看到的读者一起讨论上边报错的具体原因)
		a = new Cat();//向下转型
		System.out.println(a);
		Cat c = (Cat)a;//向下转型
		System.out.println(c);
		
		//内存中是猫
		//Dog dd = (Dog)a; //ClassCastException,a是猫的内容,没法向下转型到狗去。猫变不成狗
	}
}



多态问题的内存图解如下:


原文地址:https://www.cnblogs.com/wanghang/p/6299857.html