关于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("嘎嘎嘎");
    }
}

 

 

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

这里其实可以理解为:

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类。




原文链接:https://www.cnblogs.com/Link-Soul/p/17369151.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于java中的多态和对实例化对象的一些理解 - Python技术站

(0)
上一篇 2023年5月3日
下一篇 2023年5月4日

相关文章

  • JVM的垃圾回收算法一起来看看

    JVM的垃圾回收算法 在Java编程中,内存管理是一个非常重要的问题。Java虚拟机(JVM)的垃圾回收算法可以用来管理和清理不再使用的内存空间。本文将带你了解JVM的垃圾回收算法并提供一些示例。 垃圾回收算法 标记-清除(Mark and Sweep) 这是最早的垃圾回收算法之一,也是最容易实现的算法之一。该算法包括两个步骤:标记和清除。 标记阶段扫描堆中…

    Java 2023年5月19日
    00
  • 关于kafka-consumer-offset位移问题

    下面是关于Kafka消费者位移问题的详细攻略: 简介 在Kafka中,消费者通过消费者组(group)来消费消息。每个消费者组都有自己的消费者位移(offset),用于标识每个消费者消费消息的位置。消费者位移是在消费者端保存的,用于记录消费者消费的消息位置。这样,当消费者重启或者消费者出现故障时,就能够准确地恢复消费进度。 消费者位移有什么问题? 位移丢失。…

    Java 2023年5月20日
    00
  • jsp分页显示完整实例

    下面就来详细讲解一下“jsp分页显示完整实例”的攻略。 什么是分页显示? 分页显示是指将大量数据分开展示,并通过页面的控件使用户可以翻页操作,进行查看。 为什么需要分页显示? 如果展示的数据量过大,会导致页面加载速度变慢,甚至使页面崩溃。另外,用户在查看数据时,如果没有分页功能,会使得他们无法方便地找到所需数据。 实现分页显示的方法 实现分页显示有多种方法,…

    Java 2023年6月15日
    00
  • 详解基于JWT的springboot权限验证技术实现

    详解基于JWT的springboot权限验证技术实现攻略 前言 本篇攻略将讲解基于JWT身份验证技术实现SpringBoot权限验证的具体流程。JWT(Json Web Token)是一种跨域身份验证方式,它将一些基本的身份信息以Json格式的数据段形式加密成一个字符串,比如在大型网站的前后端分离架构中JWT技术被广泛应用。 JWT的优势 JWT作为一种跨域…

    Java 2023年5月20日
    00
  • JAVA中SSM框架的搭建实现CRUD的方法

    JAVA中SSM框架的搭建实现CRUD操作可以分为以下几个步骤: 1. 搭建环境 首先,我们需要安装必要的软件和工具: JDK Maven Eclipse或IntelliJ IDEA Tomcat MySQL 并配置环境变量和路径。安装完成后,在Eclipse或IntelliJ IDEA中创建一个新的Maven项目。 2. 添加依赖 在pom.xml文件中,…

    Java 2023年6月15日
    00
  • 浅析Java的Spring框架中IOC容器容器的应用

    浅析Java的Spring框架中IOC容器容器的应用 什么是IOC容器 IoC(Inversion of Control),即控制反转,是一种设计思想,一种面向对象编程中的思想,其主要的思想是将原本需要自己创建对象的控制权交给Spring容器,由容器来统一管理和创建对象。IoC容器是Spring框架的核心,它管理着应用程序中的所有对象。 IoC容器的应用 I…

    Java 2023年5月19日
    00
  • jmap执行失败了,怎么获取heapdump?

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。 在之前的OOM问题复盘中,我们添加了jmap脚本来自动dump内存现场,方便排查OOM问题。 但当我反复模拟OOM场景测试时,发现jmap有时可以dump成功,有时会报错,如下:经过网上一顿搜索,发现两种原因可能导致这个问题,一是执行jmap用户与jvm进程用户不一致,二…

    Java 2023年4月17日
    00
  • Java购物系统设计与实现

    Java购物系统设计与实现的攻略 1. 系统需求分析 在进行设计之前,必须要深入了解用户需求。这里假设我们设计的是一个在线商城,需要实现以下功能: 商品列表展示 商品搜索 购物车添加、修改和删除商品 下单支付 订单查询和查看订单详情 2. 数据库设计 根据需求,需要定义以下数据库表: 商品表:包含商品ID,商品名称,商品价格等信息 用户表:包括用户ID,用户…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部