问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

java向上转型实质

发布网友 发布时间:2022-04-30 16:07

我来回答

1个回答

热心网友 时间:2022-06-27 02:01

java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。

什么叫父类引用指向子类对象,且听我慢慢道来.

从2个名词开始说起:向上转型(upcasting) 、向下转型(downcasting).

举个例子:有2个类,Father是父类,Son类继承自Father。

Father f1 = new Son();   // 这就叫 upcasting (向上转型)

// 现在f1引用指向一个Son对象

Son s1 = (Son)f1;   // 这就叫 downcasting (向下转型)

// 现在f1还是指向Son对象

第2个例子:

Father f2 = new Father();

Son s2 = (Son)f2;       // 出错,子类引用不能指向父类对象

你或许会问,第1个例子中:Son s1 = (Son)f1;问什么 是正确的呢。

很简单因为f1指向一个子类对象,Father f1 = new Son(); 子类s1引用当然可以指向子类对象了。

而f2 被传给了一个Father对象,Father f2 = new Father();子类s1引用不能指向父类对象。

总结:

1。父类引用指向子类对象,而子类引用不能指向父类对象。

2。把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。

     如:Father f1 = new Son();

3。把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。

  如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1;

          其中f1前面的(Son)必须加上,进行强制转换。

一、向上转型。
通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。

1,向上转型中的方法调用。

看下面代码:

[java] view plaincopyprint?
package com.wensefu.others;  
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()方法  
        dosleep(new Male());  
        dosleep(new Female());  
    }  
      
    public static void dosleep(Human h) {  
        h.sleep();  
    }  
}  

[java] view plaincopyprint?
package com.wensefu.others;  
public class Human {  
    public void sleep() {  
        System.out.println("Human sleep..");  
    }  
}  
class Male extends Human {  
    @Override  
    public void sleep() {  
        System.out.println("Male sleep..");  
    }  
}  
class Female extends Human {  
    @Override  
    public void sleep() {  
        System.out.println("Female sleep..");  
    }  
}

注意这里的向上转型:
       Animal b=new Bird(); //向上转型
       b.eat();

此处将调用子类的eat()方法。原因:b实际指向的是Bird子类,故调用时会调用子类本身的方法。

需要注意的是向上转型时b会遗失除与父类对象共有的其他方法。如本例中的fly方法不再为b所有。

2,向上转型的好处。

看上面的代码,


   public static void dosleep(Human h) {
       h.sleep();
   }

这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,
如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了JAVA的抽象编程思想。

二、向下转型。

与向上转型相反,即是把父类对象转为子类对象。

看下面代码:

[java] view plaincopyprint?
package com.wensefu.other1;  
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来防止出现异常。

java向上转型实质

Father f1 = new Son(); // 这就叫 upcasting (向上转型)// 现在f1引用指向一个Son对象Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)// 现在f1还是指向Son对象第2个例子:Father f2 = new Father();Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象你或许会...

Java学习:向上转型和向下转型

在Java面向对象编程中,向上转型和向下转型是两个至关重要的概念。首先,向上转型涉及将子类的对象赋值给父类类型的变量。这个过程隐藏了子类特有的特性,允许我们仅使用父类中共享的方法。以下是一个简单的例子:当你有一个子类的对象,比如Dog(子类)并将其赋值给父类Animal(父类)的引用时,Dog的所...

Java向上转型和向下转型

Java中的向上转型和向下转型是两种不同的类型转换策略。向上转型是指将子类类型的对象赋值给父类类型的变量,这样做的好处是可以使用父类类型的引用调用子类的方法,但调用的是哪个具体子类的方法则取决于运行时的实际对象类型。例如:DEMO: 向上转型 尽管可以调用子类重写的方法,但不能直接使用父类类型的...

怎么理解JAVA里的上转型对象

对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。可以这样来简单地理解上转型对象:上转型度对象不是父类创建的对象,而是子类对象的“简化”形态,它不关心子类新增的功能,只关心子类继承和重写的功能。

java中的向上转型和向下转型问题。为什么一步到位的向下转型会报错,而...

所以转型没有问题 情况2: new AA() 中可能不包含BB类的全部变量和方法,强制转换无法实现 思考方法:JAVA中的变量名看成数据指针,new 是在内存中实际的创造一个实例。当创造了一个子类的实例时,指针类型是父类或子类都没有关系。但父类的实例不可能用子类的指针来表达。

求教个关于java继承的问题

一、向上转型与向下转型。对象类型的转换在Java语言平台中经常遇到,主要包 括向上转型与向下转型操作。程序开发人员需要熟练掌握这两个转型的方法以及其中容易出错的地方。如何来了解这两个转型的区别呢?笔者认为,以一个现实的例 子作为比喻,可能会更加的容易理解。如现在有动物、鸟类、燕子三个名词,...

java中对象的向上向下转型在开发中用于实现什么功能

1上转型是指将子类对象使用父类引用进行引用。得:上转型对象可以操作和使用子类继承或者重写的方法。失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。2与向上转型相反,即是把父类对象转为子类对象:作用也与上转相反。java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象...

java 向上转型是继承的方法中调用到了子类的特有方法

需要注意的一点是 这个属于多态范畴 多态又叫动态绑定 在你new对象的时候 是父类的引用指向子类对象 虽然通过这个引用看不见b()方法,但是可以看到a()方法,所以f.a()实际调用的是Zi类中的方法,而这个方法中调用了b()方法,所以是可以的,这并不是直接调用b()方法,明白了吧 你写的是间接调用 ...

java:子类对象向上转型为父类实例后,调用的是父类方法,还是子类方法...

public static void main(String[] args) { A k=new B();k.sayHi();k.hello();} } class A { public void sayHi(){ System.out.println("我是父类");} public void hello(){ System.out.println("我是父类hello");} } class B extends A{ public void sayHi(){ System.out....

java对象向上转型时会丢失其原有的属性,向下转型时会不会丢失其原有的...

从来不曾丢失过,向上转型时仅仅是看不到了,不代表不存在了。还是可以通过 Java 反射访问它们的。向下转型后又还原成原来的可见性。你在 Eclipse 这种 IDE 中 debug 一下程序就能看到,虽然一个变量是父类型,但在 debug 的 variables 视图中它们依然显示成子类型。对象本身从来未曾变过。仅仅是可见性...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
父母去世后,,还有一套房子,一个子女买下房子,如果有一个子女不... 印度妇女的为什么头上都有一颗红色的点? 室内装修一般多少钱一平方 装修房子大概要多少钱一平方 装装修费用多少钱一平米 番茄起源于什么时候 番茄是什么时候出现在中国的 如何使用cdma2000终端接打电话 英语解读汉字是如何排序的? 柚子高产栽培管理要点 小众好用的氨基酸洗面奶有哪些值得入手? java 向上转型 体脂率下降,体重却在不断上升,这是正常的吗? java中的上转型对象 在java中,向上转型的机制是怎样工作的? 为什么脂肪减下去了体重却增加了? java中的向上或者向下转型,是什么意思? 虽然体脂一直下降,但是体重上升怎么办? JAVA里向上转型有什么意义?为什么会需要向上转型?它和多态有什么关系? java中向上转型,向下转型,强制类型转换的原理? java中关于向上转型的问题 在java里面的向上转型和向下转型的具体好处在哪里? java 的向上转型到底什么意思,怎么表示? java中的向上转型有什么妙用? java中向上转型和向下转型有何用途 java上转型的好处? java为什么“一旦向上转型,就不能调用子类中的新方法”? java中的向上转型向下转型是甚么意思该如何去理解!? 关于java的向上转型 在java 中,什么叫向上转型 脸上经常去角质好吗?会出现红血丝吗? 如何让体重上去,但是体脂率下降? java:对象的向上转型有什么意义? 坚持锻炼一个多月了,体脂率下降了,肌肉率上升了,体重也有点上升了,是为什么啊? 体重变大了但是体脂率下降了肌肉也上涨了是怎么回事? 减肥肌肉量下降,体脂下降,体重也下降,是好还是不好? 每天吃水果,为什么体重降了,体脂每天都涨 体重轻了,体脂率反而升高了是为什么 拼多多可以差评吗? 新手卖家求回答~~~卖家怎样把给买家的好评改成差评?怎样在评价后面解释? 把买家的好评改成差评要怎么改 谁给我讲讲 儒林外史 的读书笔记,30一则,要10则,不要写得太好是那部分... 如何把好评改成差评? 如果java从零基础开始学,需要多长时间? it培训是学java好还是大数据? “我们爱你啊,中国”这篇诗歌的资料。 诗赞中国的诗歌 alibaba国际站橱窗多少钱 请问诗歌《中国,我的祖国》是谁写的? 阿里巴巴国际站最低费用29800元,不需要外贸操作人员,10个固定橱窗产品,那么最低费用多少?外贸人员操作 《我们爱你啊,中国》这首诗歌歌颂了中华民族什么的品格?
  • 焦点

最新推荐

猜你喜欢

热门推荐