关于上朔造型的思考!有点地方想不明白
假设现在有一只猫和一只狗,现在将它们全都上朔成动物这种类型,那么当我将狗强制转换成猫时,编译器就会抛出异常,既然狗已经上朔成动物了,也就是说已经没有了狗的特征,那么编译器又是根据什么判断这是一只狗而不是猫呢? 问题点数:0、回复次数:4Top
1 楼yangjuanli(珂儿)回复于 2004-11-03 08:35:47 得分 0
友情UP!Top
2 楼wanglei810522()回复于 2004-11-03 17:29:33 得分 0
怎么没人回答?Top
3 楼wanglei810522()回复于 2004-11-03 22:06:52 得分 0
是懒得回答还是也像我不清楚呢?Top
4 楼zcjl()回复于 2004-11-03 23:13:41 得分 0
虽然上溯为父类对象了,但自己的特征(属性和方法)并没有消失,所以不能随意转化成其他不同的派生类
比如我们规定动物这个类,它有跑、跳、吃、叫四个特征
再定义一个黄狗类,它继承并覆盖了动物的跑、跳、吃、叫四个特征,并且还扩展出自己的属性--黄毛
我们看到一条具体的黄狗时,我们可以说这是一条狗,也可以说这是一只动物
但无论我们用什么概念去称呼它,在我们面前的“黄狗”这个实质没有任何变化
不会因为我们说它是动物,它的“黄毛”这个属性就消失了,“狗叫”这个方法就还原成了动物类中定义的“动物叫”
所以如果这时我们让眼前这只上溯回动物概念的事物发出叫声的话,得到的结果仍然会是狗叫声
因此,如果我们强制这个“黄狗”的实质在被回溯到动物层后再转换成猫类动物,并且还想让它发出猫叫声,这显然是不可能的,是非法的
也许可以这样理解:
我们把一个具体的派生类对象上溯成基类时,其实只是从概念的层次上去约束了它应该暴露的属性和方法等特征。
最后用一个示例程序说明:
package com.zcjl.test;
public class TestClass {
public static void main(String[] args) {
Object obj1 = new String("A String Object");
System.out.println(obj1.toString());
Object obj2 = new TestClass();
System.out.println(obj2.toString());
//System.out.println((String) obj2); // 非法,因为TestClass和String虽然同样继承自Object,但却不是String类及其派生类的实例
//System.out.println(obj2.show()); // 非法,因为Object类没有定义show()方法
System.out.println((obj1 instanceof String));
System.out.println((obj2 instanceof TestClass));
}
public String toString() {
return "A TestClass Object";
}
public String show() {
return "TestClass.show()";
}
}
执行的结果是:
A String Object
A TestClass Object
true
trueTop




