【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();
    }
}


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


微信图片_20220105185635.png


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


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


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运算符可以避免一些问题。





目录
相关文章
|
7月前
|
Java 编译器 程序员
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
302 0
|
10月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
533 15
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
1000 60
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
245 2
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
200 2
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
240 3
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
302 1
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
141 1
下一篇
oss云网关配置