向上转型

cz7301332cz 2010-10-13 10:09:44
think in java中有一句由于向上转型是从一个较专用类型向较通用类型转,所以总是很安全的
我不明白专用类型向较通用类型转怎么就安全了?接口缩小,方法减少...小弟不才,老是对一些概念性的东西迷糊,望前辈们赐教...
...全文
306 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
barryhappy 2010-10-14
  • 打赏
  • 举报
回复

哈哈,我今天也刚好看到《Thingking in java》的这句话~

貌似向上转型之后,我的理解是:作为转型之后的类型使用时,是用不到那些被缩小的接口和被减少的方法的,所以是安全的
周靖峰 2010-10-14
  • 打赏
  • 举报
回复
为什么会安全呢?我也很奇怪啊。
我现在对向上转型的理解是为了创建像C++里面的万能指针一样的东西
class Person{
public String getInformation(){
return("Person");
}
}

class Student extends Person{
public String getInformation(){
return("Student");
}
}

class Teacher extends Person{
public String getInformation(){
return("Teacher");
}
}

public class Test{
public static void main(String[] args){
Person p;
p = new Person();
System.out.println(p.getInformation());
p = new Student();
System.out.println(p.getInformation());
p = new Teacher();
System.out.println(p.getInformation());
}
}

其中,Student的getInformation和Teacher的getInformation分别改写了Person的getInformation,因此在执行p.getInformation()时会出现不同的结果实现多态。这是我对向上转型的理解。至于安全性,我不太懂,难道说方法越少越安全?
小灰狼 2010-10-14
  • 打赏
  • 举报
回复
再次把那种例子搬出来说明一下问题

子类是比父类更加精确的类型
父类是比子类更加“泛”的类型,也就是楼主说的更加“通用”的类型


例:

水果 extends Object
桔子 extends 水果
西瓜 extends 水果

很明显,一个“西瓜”的对象其实也是其父类“水果”的一个对象
所以
水果 obj = new 桔子();

是安全的,也就是“由于向上转型是从一个较专用类型向较通用类型转,所以总是很安全的”



另外,也可以得出结论,“向下转型是可能的,但是不一定是安全的”,比如
水果 obj1 = ......
桔子 obj2 = (桔子)obj1;
因为 obj1 可能是一个桔子,所以说这是可能的,但obj1 还可能是其它的水果,比如西瓜,苹果等



最后还可以得出结论,不在一个体系中的转型是不可行的,比如再加一个模型:
学习用具 extends Object
尺子 extends 学习用具
钢笔 extends 学习用具

很显然,“尺子”不可有是一个“苹果”,一个“桔子”也不可能是一个水果......

所以下面的转型是会报编译错误:
学习用具 obj = (学习用具)(new 苹果());
zhuzeitou 2010-10-14
  • 打赏
  • 举报
回复
父类拥有的变量和方法子类都有,而子类拥有的父类则不一定有
向上转型,你能调用的都是父类的接口,所以不会产生问题,是安全的
小灰狼 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 nbda1121440 的回复:]
为什么会安全呢?我也很奇怪啊。
我现在对向上转型的理解是为了创建像C++里面的万能指针一样的东西

Java code
class Person{
public String getInformation(){
return("Person");
}
}

class Student extends Person{
public Str……
[/Quote]


你可以把多态理解成一个对象有多种类型

比如你的例子
Student stu = new Student();
Teacher tch = new Teacher();

stu 是一个 Student 类型的实例,但同时它又是 Person 的一个实例,它同时具有了 Student 和 Person 两个类型
tch 是一个 Teacher 的实例,但同时它也是 Person 的一个实例

这是多态的一种情况。


楼主的这句话“由于向上转型是从一个较专用类型向较通用类型转,所以总是很安全的”
你可以这样理解:子类的对象必然是其父类的一个对象,因此子类向父类转型是很正常的。
正如你的模型中那样,一个学生肯定会是一个人,一个老师也一定是一个人,因此
Person p = new Student();
是可以自动转型的,也是很安全的

相对来说,父类向子类转型是不安全的,还是用你的模型,一个人(Person)是可能是一个Teacher,也可能是一个 Student,因此下面的语句可能会出运行时异常:
Person p = ......
Student stu = (Student)p;

千锤_百炼 2010-10-14
  • 打赏
  • 举报
回复
学习中。。。。
sesese12345 2010-10-13
  • 打赏
  • 举报
回复
Person person = new Student();
对于person 只是看到了student内部的person 所以用person 就不能访问getSchool()了
这就是“接口缩小,方法减少”
sesese12345 2010-10-13
  • 打赏
  • 举报
回复
学习了
jay304216304 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chdw 的回复:]

像楼上的例子中,任何Student或者Student都一定是Person,这个是绝对没有任何异议的,所以这个转换是安全的

但是并不是所有的Person都是Student,所以将一个Person对象转换成Student就可能会出现异常了。
[/Quote]

说的太好了
ChDw 2010-10-13
  • 打赏
  • 举报
回复
像楼上的例子中,任何Student或者Student都一定是Person,这个是绝对没有任何异议的,所以这个转换是安全的

但是并不是所有的Person都是Student,所以将一个Person对象转换成Student就可能会出现异常了。
yaosongbai 2010-10-13
  • 打赏
  • 举报
回复
学习了
凉岑玉 2010-10-13
  • 打赏
  • 举报
回复
一个人有一个孩子··这个孩子是一个人··这句话没有任何的歧义··不会被任何人误解··但是··如果说··生孩子的这个人是个孩子··这句话就可能不对了··也就是安全性更高···
year1234 2010-10-13
  • 打赏
  • 举报
回复
学习中。。。
cz7301332cz 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 blazingfire 的回复:]
Java code

class Person{
public String getName(){...}
}

class Student extends Person{
public String getSchool(){...}
}

.....

//学生是个人,所以创建学生对象以后,当然也就创建了一个人对象呀。所以下面代码是OK
Person perso……
[/Quote]
可是我想知道为什么会是安全的呢?
blazingfire 2010-10-13
  • 打赏
  • 举报
回复

class Person{
public String getName(){...}
}

class Student extends Person{
public String getSchool(){...}
}

.....

//学生是个人,所以创建学生对象以后,当然也就创建了一个人对象呀。所以下面代码是OK
Person person = new Student();


至于“接口缩小,方法减少”表示,子类继承父类以后,可以扩充更多方法,反过来看,从子类
转化为父类,“能用的”方法就少了。如上面的 Person person ,用person 就不能访问getSchool()了。
wangyuxi1989 2010-10-13
  • 打赏
  • 举报
回复
向上转型就是子类向父类转型,它们是IS-A的关系,子类继承了父类的所有变量和方法,它完全可以表现父类的特征,不会产生歧义,就好比麻雀和鸟的关系,向上转型就是麻雀是鸟,没有任何歧义

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧