JAVA中关于继承,上转型下转型的问题。

一个对象只能有一种确切的数据类型
一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。
public class Test4 {
public int score;
public String name;
}
class Test41 extends Test4{
public int age;
public int classnum;

main里边是
Test4 t41=new Test41();
t41.age=10;
果然出错。我知道这样子不能调出age。但我知其然不知期所以然,麻烦各位前辈给点指点,谢谢。还想请问一下,上转型下转型,是什么意思?

一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法这句话是有问题的。

1。该变量可以访问子类的方法,不过方法必须是子类重写的父类的方法,并且编译的时候调用的是父类的方法,而在运行的时候就是访问的子类重写的方法。一句话:因为多态。

2。该变量不能再访问子类中的属性。因为多态是针对重写的方法的,不是覆盖的属性。

关于多态的理解

比如A a = new B();是创建了一个子类对象并把它当成父类对象A用

也就是父类引用指向子类对象

此时,引用变量a有2个类型,编译时的类型为A,运行时的类型为B.在代码编译过程中,a 只能调用属于A的方法. 不能调用B类里面的方法.注意,由于继承关系,如果B重写了A的某个方法,比如说eat(),而在代码编译过程中,a.eat()调用的是A的eat(),但在程序运行时,却运行的是B的eat(). 这就是多态

比如Animal a = new Tiger(); Tiger继承并重写了Animal的eat()方法.这也是父类引用指向子类对象.首先, a 是 一只老虎.但不幸的是,Animal a= new Tiger(); 也就是说a虽然有了老虎的实质, 就是说有了老虎的爪子,身材..... , 但却没有老虎的名分.它虽然身体是老虎, 但名字或者说它的类别却是动物,而不是老虎.而作为动物的定义,你当然不能使用属于老虎的定义的方法.比如说,虽然二者都有吃的行为, 但老虎吃肉,动物都吃肉么? 所以虽然a实质上是老虎,但在书面描述a的行为时,你只能使用动物的定义. 这个阶段就相当于代码的编译的阶段.而此时a的类型为编译时的类型-动物.而如果具体实施吃的行为时, 比如说给a喂吃的, 虽然书面定义了a只能有动物的笼统的吃的方法,比如说用嘴,没有规定要吃肉.但是现在是具体操作了,由于a实质上是老虎,所以a实质上履行的还是老虎的吃的方法. 具体的吃的过程,就相当于程序的运行的阶段. 而此时a的类型为运行时的类型-老虎
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-18
这就是一种规则,为了程序的安全性 设计考虑的,更是一种面向对象思想的体现,上转型下转型是针对父子类来说的,子类对象可以用父类形式引用这是上(即子类-》父类)转型,下转型就是一个父类声明的对象(其实是子类的实例)可以强制转型为子类(用子类声明)这是向下转型,向上转型总是能成功,向下转型却不一定(前提是该对象确实是子类对象),因为一个父类可以有多个子类。
第2个回答  2010-08-18
老爸只会种地,后来生出来的儿子读过书后学会了计算机。所以老爸虽然可以管管儿子,但是不会儿子的计算机技术。

你说的上转型,就是低辈分的人交个高辈分的人管理,下转型就是低辈分的人从高辈分人家里出来自己管理自己。
第3个回答  2010-08-18
Test4 t41=new Test41();
因为t41,返回的是父类Test4的实例化对象,而Test4 有两个成员,score和name,所以,你用父类的实例化类调用子类的变量age,肯定出错。

如果是这样写Test41 t41=new Test41(); 返回的是子类的的实例化类,这样t41就可以访问父类的成员变量。

总结一下,要看你new对象的返回结果类型,返回父类,则不能调用子类的方法,返回子类,可以调用父类的方法。
第4个回答  2010-08-18
1楼说的相当详细了,我要是补充就多余了,
4楼的你可以补充完整一下哈
第5个回答  2010-08-18
java基础(对象转型)-写给自己的博客
http://sby.javaeye.com/admin/blogs/724045

参考资料:http://sby.javaeye.com/admin/blogs/724045

相似回答