关于java中的多态和对实例化对象以及向上、向下转型的一些理解

这篇具有很好参考价值的文章主要介绍了关于java中的多态和对实例化对象以及向上、向下转型的一些理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  java面向对象三大特征即为:继承封装多态。而多态需要三大必要条件。分别是:继承、方法重写、父类引用指向子类对象。我们先一个一个来理解。

1、首先是继承和重写。这个很简单。因为多态就是建立在不同的重写之上的。也就是说多态就是在使用着一个方法的不同重写。而重写又是依赖着继承关系。

2、这个父类引用指向子类对象。

首先先上代码示例。

public class Animal {
    public void Shout(){
        System.out.println("叫叫叫");
    }
    public void Hi(){
        System.out.println("打招呼");
    }
}
class Dog extends Animal{
    public void Shout(){
        System.out.println("汪汪汪");
    }
    public void seeHouse(){
        System.out.println("看家");
    }

}class Cat extends Animal{
    public void Shout(){
        System.out.println("喵喵喵");
    }
}

class goose extends Animal{
    public void Shout(){
        System.out.println("嘎嘎嘎");
    }
}

 文章来源地址https://www.toymoban.com/news/detail-432550.html

 

public class TestPolym {
    public static void main(String[] args) {
        AnimalShout(new Dog());
        AnimalShout(new goose());
    }
    static void AnimalShout(Animal animal){
        animal.Shout();
    }
}

在如上代码中,Animal类是作为dog、cat、goose的父类。而TestPolym则是用于实现多态

先解释下父类引用指向子类对象:在TestPolym类中的AnimalShout方法中,接收着Animal类的对象。这就是父类的引用;

指向子类对象则是看这一行: 

AnimalShout(new Dog());

这里其实与AnimalShout方法放在一起可以理解为:

Animal animal = new Dog();

其实这一行打出来基本就可以理解个七七八八。这句话就是定义了一个对象 animal 然后将其实例化成 类型为 Animal 的Dog()。因为Dog、Cat这些是Animal的子类,所以类型 Animal >= Dog、Cat......这些子类。所以首先指向子类是成立的。

其次在 Animal animal = new Dog(); 这个构造器真实的类型为Dog,但是! 编译器在看animal这个对象的时候,只会将他识别为Animal类型而这行代码成立的最重要的原因是:Dog是Animal的一个子类,并且Dog类总是小于等于Animal类。然后我们看一下我们在使用什么方法。这个方法是Shout。是由Animal重写而来。因此在调用由Dog类重写Animal类的方法如此代码中的Shout方法时,此语句成立。 

反之,使用此语句去运行不是由Animal类中的方法重写而来的方法时,此语句会报错。例如用这一行去调用seeHouse时


关于java中的多态和对实例化对象以及向上、向下转型的一些理解

 编译器会红,并且建议你在Animal中创建这样一个方法,那我们去创建一下。之后就会发现,Animal和Dog两个类中都有Hi方法了,又变成重写了!而且程序也能跑的通了。所以本质上还是Animal类包含(抽象一点的)Dog类。

 

那么我就是想在不在父类中创建这方法,并且还想通过animal类去运行seeHouse呢?这时就有了向上转型和向下转型这个概念。其中向上转型其实就是Animal animal = new Dog()这一过程。而向下转型则是将 animal 这个对象,强制转换成 Dog类型的过程。

关于java中的多态和对实例化对象以及向上、向下转型的一些理解

 通过如图的方法就可以实现我们的要求。

但是这其实只是表面的美好(指编译成功),事实上有些时候会出现报错

关于java中的多态和对实例化对象以及向上、向下转型的一些理解关于java中的多态和对实例化对象以及向上、向下转型的一些理解

 例如我在Cat方法里新建一个CatEat方法。我想用同样的方法进行强制类型转换。编译并没有问题,但是却会报错

关于java中的多态和对实例化对象以及向上、向下转型的一些理解

 报错表明Dog无法强制转换为Cat。这时候回想到上面所说的: animal 对象实际上是Dog类型,而编译器只是将他看做Animal类型。Dog 和 Cat并无继承关系,所以不可以~

之后我们加个判断语句判断一下这Cat类是否跟animal的类型一样即可~(使用instanceof语句)

 

关于java中的多态和对实例化对象以及向上、向下转型的一些理解

 




到了这里,关于关于java中的多态和对实例化对象以及向上、向下转型的一些理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java面向对象——多态、Object类、instanceof关键字以及final关键字

    总之,多态是面向对象编程中一个非常重要的概念,通过它可以实现统一的接口来操作不同的对象,提高代码的可读性和可维护性。在实际编程中,多态性的使用可以使代码更加灵活和扩展性更强。方法重写是实现多态的基础。 重写如下所示 关于hashCode方法的重写: 重写t

    2024年02月12日
    浏览(69)
  • C++ 多态向上转型详解

    【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 此篇博文详解C++的多态向上转型 平台 : Qt 【Q】什么是多态? 【A】解释如下 : 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。在编程语言和类型论中,多态指

    2024年02月03日
    浏览(55)
  • 多态的转型分为向上转型和向下转型

    Java中,多态指的是同一行为,具有多个不同表现形式。通过多态,可以消除类之间的耦合关系,提高程序的可扩展性和可维护性。但多态在调用方法时,父类中如果没有该方法,会出现编译错误。也就是说,如果没有进行类型转换,不能调用子类拥有,而父类没有的方法。编

    2024年02月02日
    浏览(34)
  • 关于进程、线程、协程的概念以及Java中的应用

    本文将从“操作系统”、“Java应用”上两个角度来探究这三者的区别。 在我本人的疑惑中,我有以下3个问题。 在“多道程序环境下”,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性以及不可再现性的特征,因此需要引入进程的概念。 进程是程序执行的过

    2024年02月08日
    浏览(62)
  • unity C#中的封装、继承和多态简单易懂的经典实例

    C#中的封装、继承和多态是面向对象编程(OOP)的三大核心特性。下面分别对这三个概念进行深入解释,并通过实例来说明它们在实际开发中的应用。 封装 (Encapsulation) 实例1: 在这个例子中, BankAccount 类封装了账户余额(balance),外部不能直接修改它,只能通过 Deposit 和

    2024年02月22日
    浏览(49)
  • Java面向对象多态

    目录 多态概述 Java 多态包括以下三种方式 方法重写(Override) 向上转型(Upcasting) 实现多态 Java 多态是指同一种类型的对象,在不同的情况下有着不同的状态和行为。它是基于继承、重写和向上转型等特性实现的,多态是面向对象编程的三大特征之一,其他两个分别是封装

    2023年04月13日
    浏览(48)
  • 探索Java中的静态变量与实例变量:存储区域、生命周期以及内存分配方式的区别

    🎉欢迎来到Java面试技巧专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java面试技巧 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 在Java中,静态变量

    2024年02月12日
    浏览(31)
  • 【java】面向对象三大特性之多态

            俗话说的好,“一龙生九子,九子各不同”,这句话就蕴含了面向对象三大特性之一的多态的思想。那么多态具体有什么特点呢,就由博主来带大家梳理一下吧🤔 目录 一、什么是多态 二、重写 三、向上转型和向下转型 1、向上转型 2、向下转型 四、多态的优缺点

    2024年03月15日
    浏览(76)
  • Java面向对象 - 封装、继承和多态

    目录 第1关:什么是封装,如何使用封装 第2关:什么是继承,怎样使用继承 第3关:super的使用 第4关:方法的重写与重载 第5关:抽象类 第6关:final的理解与使用 第7关:接口 第8关:什么是多态,怎么使用多态 Java_Educoder

    2024年02月07日
    浏览(79)
  • 【C++庖丁解牛】面向对象的三大特性之一多态 | 抽象类 | 多态的原理 | 单继承和多继承关系中的虚函数表

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 需要声明的,本节课件中的代码及解释都是在vs2013下的x86程序中,涉及的指针都是4bytes。如果要其他平台

    2024年04月10日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包