黑马程序员技术交流社区
标题:
转型问题
[打印本页]
作者:
刘俊佳
时间:
2012-8-16 09:36
标题:
转型问题
Java中向上转型和向下转型是什么意思?谁能够编写代码举例详细说明一下啊
作者:
杨彪
时间:
2012-8-16 09:51
本帖最后由 杨彪 于 2012-8-16 09:57 编辑
向上转型和向下转型
Animal a = new Dog(); //向上转型
Animal 是动物类 Dog狗类 这就相当于狗是动物
//使用Dog中特有的方法
Dog d = (Dog) a; //向下转型
这个a相当于动物 而说成 动物是狗 不好没人这么说 所以就要强转
//注意:不能转换成不同类型的
Cat c = (Cat)a;
这里的a已经是狗类了 说以不能强转,就相当于一只狗你不能说他是猫类
举例:
孔子爹:教课(java)
孔子:教课(论语),玩游戏()
//多态
孔子爹 k爹 = new 孔子(); //孔子就穿上他爹的衣服,装爹 向上转型
k爹.教课(); //论语
//k爹.玩游戏();
孔子 k = (孔子) k爹; //脱下衣服,穿上自己衣服。向下转型
k.玩游戏();
作者:
官文昌
时间:
2012-8-16 09:54
向上向下转型中的上和下是指继承树中的上层和下层,上层表示父类以及更上层,下层表示此类的子类或更下层。
向上转型:Animal animal = new Cat(),其中Cat类继承Animal类或者是实现Animal接口,我们现在的把新new出来的Cat对象赋值给一个Animal的引用就是向上转型,我们用animal变量只能得到Cat中的部分方法和Animal的全部方法。
向下转型:Cat cat = (Cat)animal,这里我们用强制类型转换到子类Cat类型。
在向上转型中我们无需加强制类型转换,但是在向下转型中我们必须加上强制类型转换,否则编译器编译不通过。(这是黑马其它的回答你可以看看)
作者:
周瑞
时间:
2012-8-16 09:58
向上转型:通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口
看下面代码:
public class Animal {
public void eat(){
System.out.println("animal eatting...");
}
}
class Bird extends Animal{
public void eat(){
System.out.println("bird eatting...");
}
public void fly(){
System.out.println("bird flying...");
}
}
class Main{
public static void main(String[] args) {
Animal b=new Bird(); //向上转型
b.eat();
//! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法
}
复制代码
此处将调用子类的eat()方法。原因:b实际指向的是Bird子类,故调用时会调用子类本身的方法。
需要注意的是向上转型时b会遗失除与父类对象共有的其他方法。如本例中的fly方法不再为b所有。
向下转型:与向上转型相反,即是把父类对象转为子类对象。
看下面代码:
public class Girl {
public void smile(){
System.out.println("girl smile()...");
}
}
class MMGirl extends Girl{
@Override
public void smile() {
System.out.println("MMirl smile sounds sweet...");
}
public void c(){
System.out.println("MMirl c()...");
}
}
class Main{
public static void main(String[] args) {
Girl g1=new MMGirl(); //向上转型
g1.smile();
MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错
mmg.smile();
mmg.c();
Girl g2=new Girl();
// MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
// mmg1.smile();
// mmg1.c();
/*output:
* CGirl smile sounds sweet...
* CGirl smile sounds sweet...
* CGirl c()...
* Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl
* at com.wensefu.other1.Main.main(Girl.java:36)
*/
if(g2 instanceof MMGirl){
MMGirl mmg1=(MMGirl)g2;
mmg1.smile();
mmg1.c();
}
}
}
复制代码
Girl g1=new MMGirl(); //向上转型
g1.smile();
MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错
这里的向下转型是安全的。因为g1指向的是子类对象。
而Girl g2=new Girl();
MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
运行出错:
Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl
at com.wensefu.other1.Main.main(Girl.java:36)
如代码所示,可以通过instanceof来防止出现异常。
作者:
杨健yj
时间:
2012-8-16 10:01
给你举个简单的例子,看代码注释
class Demo
{
public static void main(String[] args)
{
//这是多态父类引用指向子类对象也是向上转型,就是本来是猫Cat的实体对象想在使用的是动物
//Animal的引用,及Cat猫转为Animal动物
Animal a = new Cat();
//这里a所引用的对象实际上是猫对象,所以我们可以强制将动物的引用a转换为更明确的对象猫
//及动物转为猫,这就叫做向下转型
Cat c = (Cat)a;
}
}
class Aniaml
{
}
class Cat extends Animal
{
}
复制代码
作者:
黑马王冬冬
时间:
2012-8-16 16:26
1.向上转型和向下转型是和多态紧密相关的。
2.java引用变量的两种类型
==>编译时类型,由声明该变量是使用的类型决定。
==>运行时类型,由实际赋给该变量的对象决定。
如果编译时类型和运行时类型不一致时,就会出现多态polymorphism。
BaseClass polymorphism = new SubClass();
3.当把子类对象赋给父类引用变量时,被称为向上转型upcasting。
因为子类其实是一种特殊的父类,因而java允许把一个子类对象直接赋给一个父类引用变量,无需任何类型转换,该转换由系统自动完成。
当把父类对象赋给子类引用变量时,被称为向下转型downcasting。进行向下转换需要进行强制类型转换,而且可能产生ClassCastException异常。
示例如下
class BaseClass{
}
class SubClass extends BaseClass{
public static void main(String[] args){
//向上转型,子类对象赋给父类引用变量
BaseClass upcast = new SubClass();
//向下转型,强制类型转换
SubClass downcast = (SubClass)new BaseClass();
}
}
复制代码
作者:
刘俊佳
时间:
2012-8-19 10:17
谢谢,问题已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2