Java 多态中继承的转型详解与用法分析

目录
  • 一、前言
  • 二、转型
    • 向上转型
    • 向下转型
  • 三、instanceof运算符
    • instanceof的用处
    • instanceof的使用格式:

一、前言

前面我们学习了多态的概述和使用,现在我们来学习前面剩下的转型问题。

二、转型

🗡 向上转型

🗡向下转型

为什么会有转型呢,前面我们也说到了,多态中的使用前提是有父类引用指向子类对象

还有多态的缺点就是不能访问子类对象。(可以用到向下转型访问)

向上转型

🗡其实多态中的父类引用指向子类对象就是向下转型,向下转型就是子到父。

就是将子类所申请的空间赋值给父类。形式: fu f=new zi();

向下转型

🗡向下转型的出现就是为了解决多态中无法访问子类成员的问题,其实向下转型本质上

就是强转,由父到子,父类对象转化为子类对象。形式:zi z= (zi)f ;

我们看个例子:

在fu类中

public class Fu {
  public   void show(){
        System.out.println("fu:1024程序员节");
    }
  public void play(){
      System.out.println("fu:1024不见不散");
    }
}

zi类中

public class Zi extends Fu {
    @Override
    public void show() {//重写fu类中的show方法
        super.show();
        System.out.println("zi:1024来了呀");
    }
    public void game(){
        System.out.println("zi:写篇博客提提神");
    }
    public void juan(){
        System.out.println("zi:全员卷王");
    }
}

新建一个测试类

public class FuZiDemo {
    public static void main(String[] args) {
        Fu f=new Zi();//向上转型
        Zi z=(Zi)f;//向下转型
        z.show();
        z.game();
        z.juan();
        z.play();
    }
}

通过向上和向下转型,此时我们可以访问子类父类全部成员

🗡 其实虽然直接创建子类对象是非常方便的,但是我们多态的实现条件之一就是有

父类引用指向子类对象(接口的多态暂时不考虑)

public class FuZiDemo {
    public static void main(String[] args) {

        Zi z=new Zi();//通过子类直接创建对象
        z.show();
        z.game();
        z.juan();
        z.play();

    }
}

🗡由上述结果可知,子类对象向上转型为父类对象是不需要显示转换,而父类对象转化

为子类对象时,需要显示强制类型转化。

友情提示:向下转型还有几点需要注意的地方:

🗡①必须保证父类对象是子类的一个实例,否则程序报错。

🗡②向下转型的对象可以访问父类中的成员和方法,也可以访问子类中的成员和方法。

public class Demo11 {
    public static void main(String[] args) {
     Animal a=new Dog();
      Dog g=(Dog)a;
     Cat c=(Cat)a;//??能否成功

    }
}

🗡上述代码中,父类对象a引用的是子类Dog对象,而不是Cat类对象,可以将a强

制转化为Dog类型,不能a强制转化为Cat类型,因为向下转型必须确保父类对象是

子类的一个实例所以这个程序不能成功,且在运行时会出现转换异常的警告。

三、instanceof运算符

instanceof的用处

🗡由上可知,向下转型必须确包父类对象是子类的一个实例,否则程序会异常,

instanceof 就是为了确保向下转型不出现异常。instanceof运算符用来在运行时

指出对象是否是特定类的一个实例

instanceof的使用格式:

🗡对象名 instanceof 类名

🗡instanceof返回一个布尔值来指出这个对象是否是这个特定类或者使他的子类的

一个实例。返回true则是,反之则不是。

public class Demo11 {
    public static void main(String[] args) {
     Animal a=new Dog();
    if(a instanceof Dog){
      Dog g=(Dog)a;
    }
      if( a instanceof Cat){//判断作用
        Cat c=(Cat)a;
      }
    }
}

🗡所以我们在进行向下转型之前采用instanceof运算符可以避免一些问题。

到此这篇关于Java 多态中继承的转型详解与用法分析的文章就介绍到这了,更多相关Java 多态中继承的转型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java多态注意项小结

    展示多态现象 package test; //父类引用,指向(不同子类)的实例,对同一个实例方法名调用,调用的程序不 //一样.继承是多态得以实现的基础. public interface test1 { void shout(); } package test; public class test2 implements test1 { public void shout() { System.out.println("1111"); } } package test; public

  • Java编程 多态

    目录 一.向上转型 二.转机 1.绑定 2.扩展性 3.缺陷 三.构造器与多态 1.构造器的调用顺序 2.构造器内部的多态方法的行为 四.协变返回类型 五.继承进行设计 前言: 封装,是合并属性和行为创建一种新的数据类型,继承是建立数据类型之间的某种关系(is-a),而多态就是这种关系在实际场景的运用. 多态就是把做什么和怎么做分开了:其中,做什么是指调用的哪个方法[play 乐器],怎么做是指实现方案[使用A乐器 使用B乐器],''分开了''指两件事不在同一时间确定. 一.向上转型 对象既可以

  • Java之理解多态详解

    目录 一.多态的概念 二.多态的特点 三.instanceof操作符 四.多态的转型 1.向上转型 2.向下转型 五.方法重写 六.小结 一.多态的概念        继承关系使一个子类能继承父类的特征,并且附加一些新特征.子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立.例如:每个圆都是一个几何对象,但并非每个几何对象都是圆.因此,总可以将子类的实例传给需要父类型的参数.参考案例如下: public class PolymorphismDemo{ /** Main me

  • java 对象实例化过程中的多态特性解析

    目录 java 对象实例化过程中的多态特性 通过案例说明 通过上述代码 java对象的三个特性(封装.继承.多态) 1.封装 2.继承 3.多态 java 对象实例化过程中的多态特性 执行对象实例化过程中遵循多态特性 ==> 调用的方法都是实例化的子类中的重写方法,只有明确调用了super.xxx关键词或者是子类中没有该方法时,才会去调用父类相同的同名方法. 通过案例说明 package com.njau.test1; class Test { public static void main(S

  • Java 多态中继承的转型详解与用法分析

    目录 一.前言 二.转型 向上转型 向下转型 三.instanceof运算符 instanceof的用处 instanceof的使用格式: 一.前言 前面我们学习了多态的概述和使用,现在我们来学习前面剩下的转型问题. 二.转型

  • Java设计模式中桥接模式应用详解

    目录 1.桥接(Bridge)设计模式定义 2.桥接设计模式优点以及不足 3.桥接设计的实现思路 4.桥接设计模式示例 5.桥接模式的应用场景 6.桥接设计模式和适配器设计模式对比 编程是一门艺术,大批量的改动显然是非常丑陋的做法,用心的琢磨写的代码让它变的更美观. 显示生活中有物品具有多个维度的属性,比如文字有颜色和字体两个维度的差别,汽车有颜色和牌子两个维度的属性等.如果用继承方式,不但对应的子类很多,而且扩展困难.如果用桥接模式就能很好地解决这些问题. 1.桥接(Bridge)设计模式定义

  • Java设计模式中的门面模式详解

    目录 门面模式 概述 应用场景 目的 优缺点 主要角色 门面模式的基本使用 创建子系统角色 创建外观角色 客户端调用 门面模式实现商城下单 库存系统 支付系统 物流系统 入口系统 客户端调用 门面模式 概述 门面模式(Facade Pattern)又叫外观模式,属于结构性模式. 它提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口.使得子系统更容易使用. 客户端不需要知道系统内部的复杂联系,只需定义系统的入口.即在客户端和复杂系统之间再加一层,这一层

  • java开发中嵌套类的详解及实例

     java开发中嵌套类的详解 在java语言规范里面,嵌套类(Nested Classes)定义是: A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class that is not a nested class. 说的简单一点,就是定义在类里面的类.一般把定义内部类的外围类成为包装类(enclos

  • Java多线程中ReentrantLock与Condition详解

    一.ReentrantLock类 1.1什么是reentrantlock java.util.concurrent.lock中的Lock框架是锁定的一个抽象,它允许把锁定的实现作为Java类,而不是作为语言的特性来实现.这就为Lock的多种实现留下了空间,各种实现可能有不同的调度算法.性能特性或者锁定语义.ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些特性.此外,它还提供了在激烈争用情况下更

  • Java jvm中Code Cache案例详解

    Code Cache JVM生成的native code存放的内存空间称之为Code Cache:JIT编译.JNI等都会编译代码到native code,其中JIT生成的native code占用了Code Cache的绝大部分空间 相关参数 Codecache Size Options -XX:InitialCodeCacheSize 用于设置初始CodeCache大小 -XX:ReservedCodeCacheSize 用于设置Reserved code cache的最大大小,通常默认是2

  • Java BigDecimal中divide方法案例详解

    1.首先说一下用法,BigDecimal中的divide主要就是用来做除法的运算.其中有这么一个方法. public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode) 第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式. BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2 BigDecimal.ROUND_UP:直接进位,比如1.21如

  • Java开发过程中关于异常处理的详解

    1.运行java时,出现了异常: 我这里是因为:arr[3]不存在: java.lang.ArrayIndexOutOfBoundsException: 3 public class btyf { public static void main(String[] args){ int[] arr={1,2,3}; System.out.println(arr[0]); System.out.println(arr[3]); System.out.println(arr[1]); //1 异常 A

  • Java多线程中的Balking模式详解

    目录 1.场景 2.详细说明 3.Balking模式的本质:停止并返回 源代码如下: 总结 1.场景 自动保存功能: 为防止电脑死机,而定期将数据内容保存到文件中的功能. 2.详细说明 当数据内容被修改时,内容才会被保存.即当写入的内容与上次写入的内容一致时,其实就没有必要执行写入操作.也就是说,以”数据内容是否一致”作为守护条件.若数据内容相同,则不执行写入操作,直接返回. 3.Balking模式的本质:停止并返回 如果现在不合适执行该操作,或者没有必要执行该操作,就停止处理,直接返回—-Ba

  • Java设计模式中的外观模式详解

    目录 模式介绍 UML类图 外观模式案例: 外观模式的注意事项和细节 模式介绍 外观模式(Facade) ,也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节. UML类图 类图解析: Facade:为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象

随机推荐