向上转型:

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

如果子类重写了父类的方法,就根据这个引用指向调用子类重写的这个方法,不是调用父类的,,这个调用过程就称为“动态绑定”。

”动态绑定“的意义:如果父类是接口意味则父类是没办法实现方法的,必须要子类去实现,这时如果发生了向上转型,如果不实行动态绑定的话,子类就会陷入无方法可用的困境。而采用动态绑定的话,子类就算发生了向上转型也能实现重写的方法,而则恰恰是接口存在的意义。而代理功能就刚好是这种模式。

示例代码

public class UpClass {
public static void main(String[] args) {
/*这里注意调用的是子类的构造方法
Animal aBird = new Bird();
等价于
1.new Bird(); 这里调用父类的构造方法,然后再调用子类自己的构造方法
2.Aniaml aBird = 子类的引用
*/ Animal aBird = new Bird(); aBird.eat();//注意这里调用的是子类的方法,不是父类的,因为重写了父类的eat()方法 //aBird.fly();错误,向上转型会丢失子类方法 System.out.println("-----------------"); Animal animal = new Animal();
animal.eat(); }
} class Animal{
public Animal() {
System.out.println("Animal initialization");
}
public void eat() {
System.out.println("animal eat");
}
} class Bird extends Animal{
public Bird() {
System.out.println("Bird initialization");
}
@Override
public void eat() {
System.out.println("bird eat");
}
public void fly() {
System.out.println("bird can fly");
}
} 结果:
Animal initialization
Bird initialization
bird eat
-----------------
Animal initialization
animal eat
Animal aBird = new Bird();
就是一个典型的向上转型,子类对象当成父类对象,只能调用父类的成员 注意:
如果子类重写了父类的方法,就根据这个引用指向调用子类重写的这个方法,不是调用父类的,在上例子表示为调用Bird.eat(),而不是Animal.eat(),这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。 某种程度上来说,向上转型能且只能调用子类的两种方法,,一是子类的构造方法,二是子类重写父类的方法 向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。在上例中aBird.fly()出现错误就是这个原因

向下转型:

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

 1 public class Person {
2 public void smile(){
3 System.out.println("Person smile!");
4 }
5 }
6
7 class Girl extends Person{
8 public void smile() {
9 System.out.println("Girl smile!");
10 }
11
12 public void sing(){
13 System.out.println("Girl sing!");
14 }
15 }
16
17 class main{
18 public static void main(String[] args) {
19 Person person=new Girl(); //向上转型
20 person.smile();
21
22 Girl girl=(Girl)person; //向下转型,编译和运行皆不会出错
23 girl.smile();
24 girl.sing();
25
26 Person person1=new Person();
27 //Girl girl1=(Girl)person1; //不安全的向下转型,编译无错但会运行会出错
28 //girl1.smile();
29 //girl1.sing();
30
31 if(person1 instanceof Girl){
32 Girl girl1=(Girl)person1;
33 girl1.smile();
34 girl1.sing();
35 }
36 }

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

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

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



总结:

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

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

     如Father father = new Son();

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

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

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

  4、向上转型会丢失子类特有的方法,但是子类重写父类的方法,子类方法有效;

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

【JAVA】关于向上转型与向下转型的更多相关文章

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

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

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

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

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

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

  4. JavaSE(五)JAVA对象向上转型和向下转型

    今天做了一个测试的题目,发现自己还是很多问题没有静下心来做.很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了.所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话 ...

  5. JAVA的向上转型和向下转型怎么理解呢?

    在定义中是子类向父类转型称为向上转型,父类向子类转型是向下转型(必须先向上转型过,才能向下转型), 但是在下面类定义后,我得到的结果却不同.求大佬解惑 class superclass{ public ...

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

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

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

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

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

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

  9. Java向上转型和向下转型(附具体样例)

                                                Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一 ...

  10. 重新精读《Java 编程思想》系列之向上转型与向下转型

    前言 今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型.在此分享给大家. 向上转型 向上转型是用来表现新类和基类之间的关系.在传统中,由导出类转型成基类,在继承图中 ...

随机推荐

  1. Git Gui 常见错误

  2. POI 导入导出时异常[java.io.IOException: Broken pipe]

    使用用POI导出文件时抛出异常java.io.IOException: Broken pipe ERROR: 'java.io.IOException: Broken pipe' org.apache ...

  3. 03-python-装饰器

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权 ...

  4. Superclass和Constructor Chaining

    A subclass inherits accessible date fields and methods from its superclass. Does it inherit construc ...

  5. 用 EasyUEFI 在 Win8/10 中硬盘安装 Ubuntu16.04图文教程

    用 EasyUEFI 在 Win8/10 中硬盘安装 Ubuntu 作者:TeliuTe 来源:基础教程网 1.准备Ubuntu安装文件 1)下载带amd的64位 Ubuntu 桌面版光盘镜像文件,如 ...

  6. es-aggregations聚合分析

    聚合分析的格式: "aggregations" : { "<aggregation_name>" : { "<aggregation ...

  7. 2、OpenSsh

    OpenSsh /etc/ssh/sshd_config # 配置文件 选项 Port 22 端口号 Listenaddress 0.0.0.0 OpenSSH服务器绑定的IP PermitRootL ...

  8. Leetcode 692 - Note

    1. 题目要求 Given a non-empty list of words, return the k most frequent elements. Your answer should be ...

  9. python记录_day11 闭包 迭代器

    一.第一类对象: 函数名是一个变量,可以当普通变量使用,但它又是一个特殊的变量,与括号配合可以执行函数. 函数名的运用 1.单独打印是一个内存地址 2.可以给其他变量赋值 3.可以作为容器类变量的元素 ...

  10. 第二阶段——个人工作总结DAY07

    1.昨天做了什么:昨天了解了一下时间抽也是一种ListView,然后就此学习了一下如何来修改. 2.今天打算做什么:今天在网上搜一些例子,找比较好看的界面,并实现代码. 3.遇到的困难:不知道最后连接 ...