今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴!

对象的转型问题其实并不复杂,我们记住一句话:“父类引用指向子类对象”。

java中对象的转型分为向上转型和向下转型

一、对象的向上转型

  1.1、定义

    子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口

  1.2、解释

    比如说我有两个类,一个是父类Animal,另一个是Bird类为子类。

    Animal b = new Bird();

    这就是upcasting,向上转型。这时b就是执行以恶搞Bird对象。

  1.3、实例

 

package com.zyh.test;

public class Animal {
public void eat(){
System.out.println("animal eating....");
}
}
class Bird extends Animal{
public void eat(){
System.out.println("Bird eating...");
}
public void fly(){
System.out.println("Bird flying...");
}
}
class Main{
public static void main(String[] args){
Animal b1 = new Bird();
b1.eat();
// b1.fly(); b虽然指向子类对象,但此时丢失了fly方法
doSleep(new Male());
doSleep(new Female()); }
public static void doSleep(Human h){
h.sleep();
}
}

Animal.java

package com.zyh.test;

public class Animal {
public void eat(){
System.out.println("animal eating....");
}
}
class Bird extends Animal{
public void eat(){
System.out.println("Bird eating...");
}
public void fly(){
System.out.println("Bird flying...");
}
}
class Main{
public static void main(String[] args){
Animal b1 = new Bird();
b1.eat();
// b1.fly(); b虽然指向子类对象,但此时丢失了fly方法
doSleep(new Male());
doSleep(new Female()); }
public static void doSleep(Human h){
h.sleep();
}
}

Huamn

  注意:

    这里的向上转型:

      Animal b = new Bird();

       b.eat();

    这里调用的eat方法是子类的。因为b实际指向的是Bird子类,故调用时会调用子类本身的方法。

    要记住向上转型时父类的引用会遗失除与父类共有的其他方法。在上面的例子中b不能调用fly方法。

    向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。

  1.4、向上转型的优点 

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

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

二、对象的向下转型

  1.1、定义

    父类引用的对象转换为子类类型成为向下转型

  1.2、解释

    Son s = (Son)f1;

    这就是downcasting,向下转型。

  1.3、实例

package com.zyh.test;

public class Person {
public void play(){
System.out.println("Person play...");
}
}
class Boy extends Person{
public void play(){
System.out.println("boy play...");
}
public void run(){
System.out.println("run play...");
}
}
class RunMain{
public static void main(String[] args){
Person b = new Boy();//向上转型
b.play();
System.out.println("-------------------------");
Boy b1 =(Boy)b;//向下转型
b1.play();
b1.run(); }
}

  结果:

    

  在这个程序中       

    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)

  所以向下转型过程中要注意的是:     

    情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。

    情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。

 三、总结

1、父类引用可以指向子类对象,子类引用不能指向父类对象。

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

   如Father father = new Son();

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

   如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;

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

4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效

5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。

JavaSE(五)JAVA对象向上转型和向下转型的更多相关文章

  1. “全栈2019”Java第五十三章:向上转型和向下转型详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. Java入门记(二):向上转型与向下转型

    在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...

  3. Java中的向上转型和向下转型

    首先要明白一点向上转型和向下转型他们都是建立在继承的基础上. 一.向上转型 子类到父类的转换通常称作向上转型,通俗的说就是定义父类对象指向子类对象. 下面通过一个例子来深入理解向上转型. //定义一个 ...

  4. Java转型(向上转型和向下转型)

    在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就 ...

  5. java 向上转型与向下转型

    转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...

  6. 【JAVA】关于向上转型与向下转型

    向上转型: 子类引用的对象转换为父类类型称为向上转型.通俗地说就是是将子类对象转为父类对象.此处父类对象可以是接口 如果子类重写了父类的方法,就根据这个引用指向调用子类重写的这个方法,不是调用父类的, ...

  7. Java多态的向上转型和向下转型

    Java多态的向上转型和向下转型 向上转型:(子类转为父类,自动转型) 格式 :父类类型 变量名 = new 子类类型(); 注:子类赋值给父类,那这时这个父类就能调用子类的方法 向下转型:(父类转为 ...

  8. java 向上转型和向下转型

    学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白.没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法. 首先看下怎么 ...

  9. java向上转型和向下转型

    转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...

随机推荐

  1. textarea的中文输入判断与搜狗输入法的特殊行为

    虽然要讲解的知识点是通用的,但是还是要介绍下我的应用场景和测试环境. 0.1 应用场景和测试环境 我的应用是一块使用Html Canvas开发的黑板,在黑板上实现简单的文字编辑功能. 操作系统:win ...

  2. Django rest framework 自定义Exception

    使用Dango rest framework时,有时需要raise APIException到前端,为了统一错误返回格式,我们需要对exception的格式进行调整. 方法: 1. 在project/ ...

  3. 有关Dom的一些操作

    学习前端的都会了解到一些Dom操作,让我们来看看Dom操作有哪些吧! DOM(即 Document Object Mode) 是 W3C(万维网联盟)的标准. DOM 定义了访问 HTML 和 XML ...

  4. .net 4.0 中的特性总结(二):默认参数、命名参数

    1.在方法定义的时候为参数指定一个默认值.调用方法的时候既可以像平时那样传入参数,也可以直接跳过不传入,这样的话,就使用默认值传到方法里.例如: 2.在之前版本的C#中,方法定义的参数顺序必须与方法调 ...

  5. [USACO07NOV]电话线Telephone Wire

    [USACO07NOV]电话线Telephone Wire 时间限制: 1 Sec  内存限制: 128 MB 题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N &l ...

  6. nginx+ftp搭建图片服务器(Windows Server服务器环境下)

    几种图片服务器的对比 1.直接使用ftp服务器,访问图片路径为 ftp://账户:密码@192.168.0.106/31275-105.jpg 不采用这种方式,不安全容易暴露ftp账户信息 2.直接使 ...

  7. windows下python连接oracle数据库

    1.首先安装cx_Oracle包2.解压instantclient-basic-windows.x64-11.2.0.4.0.zip到c:\oracle3.拷贝instantclient_11_2下所 ...

  8. php中查询mysql如何在IN array中用

    假如有一个数组 $arr = array(1,3,5,7,9)那么我在如何在php中使用mysqlWHERE id IN (1,3,5,7,9.......)$arr_string = join(', ...

  9. js循环处理后台返回的json数组

    <script type="text/javascript"> function gongdan_search(elm){ var dangqian_value=$(e ...

  10. 【hexo】如何在一个小时内搭载个人博客

    版权申明:本文为博主原创文章,未经博主允许不得转载.如需转载,请私聊博主. 什么是hexo Hexo是一个开源的静态博客生成器,用node.js开发,作者是台湾大学生tommy351. 前期准备 安装 ...