java 向上转型(upcasting)和向下转型(downcasting)区别举例详解

今天下午小龙在练习instanceof用法时突然想到java的upcating 和 downcasting 好像与此有关联,于是自己写了一个相关的案例,在此与众位看到的亲们分享一下,希望能帮到正在学习的伙伴们。

package com.instanceoftest;

/**  java向上转型和向下转型,以及用instanceof方法来防止向下转型错误

* 接口说明

*interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final 的,不过在interface中一般不定义数据成员),

*所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的 abstract class。

*

* @author mengfl

*

*/

interface Animal{

public static final String color = "blue";

//abstract void voice();

abstract void eat();

}

class FlyAnimal implements Animal{

public void eat() {

// TODO Auto-generated method stub

System.out.println("父类 FlyAnimal eat worm!");

}

public void voice() {

// TODO Auto-generated method stub

System.out.println("父类 FlyAnimal sing wonderful!");

}

}

/*

* 继承接口

*/

class Parrot extends FlyAnimal {

@Override

public void eat() {

// TODO Auto-generated method stub

System.out.println("parrot eat worm!");

}

@Override

public void voice() {

// TODO Auto-generated method stub

System.out.println("parrot sing wonderful!");

}

public void jump(){

System.out.println("parrot can jump!");

}

}

class Instanceoftest {

public static void main(String[] args){

Animal a1 = new Parrot();

//a1.eat();//向上转型,只能调用父类Animal中的eat()方法

FlyAnimal a2 = new Parrot();//向上转型

// a2.eat();

// a2.voice();//向上转型,只能调用父类FlyAnimal中的eat()和voice()方法。

//  在向下转型过程中,分为两种情况:

//

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

//

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

Parrot a3 = (Parrot)a2;// 安全的向下转型,编译和运行皆不会出错。注意这是建立在向上转型的基础上的

// a3.eat();

// a3.voice();

// a3.jump();

FlyAnimal a4 = new FlyAnimal();

//运行到下面的   Parrot a5 = (Parrot)a4   方法时,报以下异常

//Exception in thread "main" java.lang.ClassCastException: com.instanceoftest.FlyAnimal cannot be cast to com.instanceoftest.Parrot

//  Parrot a5 = (Parrot)a4; //不安全的向下转型,编译无错但会运行会出错

//  a5.eat();

//  a5.voice();

//  a5.jump();

if(a4 instanceof Parrot){

Parrot a5 = (Parrot)a4;

a5.eat();

a5.voice();

a5.jump();

}

}

}

//总结

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

//例如:FlyAnimal flyAnimal = new Parrot(); 可以

//    Parrot a7 = new FlyAnimal();不可以

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

//

//    如Father father = new Son();//向上转型

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

//在 FlyAnimal flyAnimal = new Parrot()中,如flyAnimal就是一个指向子类对象的父类引用

//,把flyAnimal赋给子类引用Parrot 即Parrot parrot =(Parrot)flyAnimal;

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

时间: 2024-11-13 20:14:43

java 向上转型(upcasting)和向下转型(downcasting)区别举例详解的相关文章

java中4种修饰符访问权限的区别及详解全过程

java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为public.protect.default.private,他们这就说明了面向对象的封装性,所以我们要适用他们尽可能的让权限降到最低,从而安全性提高. 下面详细讲述下它们的访问权限问题.(同一个类中除内部类外所有修饰符都是可以访问的,所以下面排除这种情况.) 首先在这里把它们的访问权限表示出来:

JAVA对象 向上转型upcasting,向下转型downcasting

1:向上转型 向上转型,就是java多态中的父类引用指向子类对象.但要注意的是 父类引用不可以访问子类新增加的成员(熟悉和方法) 代码举例: /** * 定义一个父类 */ public class Anaimal{ private Long height; public Long getHeight() { return height; } public void setHeight(Long height) { this.height = height; } } /** * 下面的main方

Windows下安装Resin及配置详解与发布应用

关于Resin的好处,网上介绍了一大堆,小编经不住诱惑,决定试用一下.目前Resin的最新版本为:4.0.40,可以从官网直接下载. 1. 将下载下来的Resin包解压开,会看到一大堆的文件,有一些关键的文件,我们需要了解一下. resin-4.0.40 resin安装目录   --conf/resin.properties 配置属性   --conf/resin.xml 配置文件   --conf/licenses/ 许可信息文件   --conf/keys/ openSSL 秘钥   --w

Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合 第一.Logger.getLogger()和LogFactory.getLog()的区别     1.Logger.getLogger()是使用log4j的方式记录日志:  2.LogFactory.getLog()则来自apache的common-logging包. common-logging组件:         Jakarta Commons

Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

Android PullToRefresh (ListView GridView 下拉刷新) 使用详解 标签: Android下拉刷新pullToRefreshListViewGridView 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:[张鸿洋的博客] 群里一哥们今天聊天偶然提到这个git hub上的控件:pull-to-r

【Linux学习】Linux下用户组、文件权限详解

原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者 用ls ‐ahl命令可以看到文件的所有者 也可以使用chown 用户名 文件名来修改文件的所有者 文件所在组 当某个用户创

Android研究之手PullToRefresh(ListView GridView 下拉刷新)使用详解

 群里一哥们今天聊天偶然提到这个git hub上的控件:pull-to-refresh ,有兴趣的看下,例子中的功能极其强大,支持很多控件.本篇博客详细给大家介绍下ListView和GridView利用pull-to-rerfesh 实现下拉刷新和上拉加载更多.对布局不清楚的可以看Android研究自定义ViewGroup实现FlowLayout 详解. 1.ListView下拉刷新快速入门 pull-to-refresh对ListView进行了封装,叫做:PullToRefreshList

“全栈2019”Java第七十一章:外部类访问静态内部类成员详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第七十一章:外部类访问静态内部类成员详解 下一章 "全栈2019"Java第七十二章:静态内部类访问外部类成员 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Jav

“全栈2019”Java第一百零五章:匿名内部类覆盖作用域成员详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第一百零五章:匿名内部类覆盖作用域成员详解 下一章 "全栈2019"Java第一百零六章:匿名内部类与抽象类接口注意事项 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo