首页 > 其他分享 >父类引用对象引用子类对象--多态

父类引用对象引用子类对象--多态

时间:2023-12-20 22:44:06浏览次数:31  
标签:子类 Dog 多态 引用 Animal 类型 父类

在Java中,父类引用对象调用子类对象的原理涉及到两个关键概念:编译时类型和运行时类型。

  1. 编译时类型(Compile-time Type):

    • 编译时类型是指在编写代码时,你所声明的引用的类型。例如,如果你有一个声明为Animal animal的引用,编译时类型就是Animal
  2. 运行时类型(Runtime Type):

    • 运行时类型是指在程序运行时实际指向的对象的类型。如果在运行时,animal引用实际上指向了一个Dog对象,那么运行时类型就是Dog

Java中的多态性允许你使用父类的引用来引用子类的对象。这意味着,你可以将一个子类的对象分配给一个父类的引用,然后通过这个父类的引用调用在父类和子类中都存在的方法。

示例代码:

class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }

    public void fetch() {
        System.out.println("Dog fetches a ball");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 编译时类型是Animal,运行时类型是Dog
        animal.sound(); // 调用的是Dog类的sound方法,输出 "Dog barks"
        
        // 下面的代码无法通过编译,因为编译时类型是Animal,编译器只知道Animal类的方法
        // animal.fetch(); // 编译错误

        // 若要调用子类特有的方法,需要将引用强制转换为子类类型
        if (animal instanceof Dog) {
            Dog dog = (Dog) animal;
            dog.fetch(); // 可以调用Dog类的fetch方法
        }
    }
}

总的来说,Java的多态性允许你在编写代码时使用通用的父类引用,然后在运行时实际指向子类对象,这样你可以在不知道对象的具体类型的情况下调用相同的方法。当然,要注意在使用时确保引用的运行时类型是正确的,否则可能会引发ClassCastException

标签:子类,Dog,多态,引用,Animal,类型,父类
From: https://www.cnblogs.com/trmbh12/p/17917800.html

相关文章

  • go的封装、继承与多态的使用
    目录一、封装1.1公有封装1.2私有封装1.2.1工厂函数解析1.2.2&与*指针使用描述1.3深度封装二、继承与多态2.1继承与多态案例2.1.1继承代码分析2.1.2结构体实例化2.1.3多态代码分析一、封装​ 在Go语言中,封装是一种将数据和操作数据的方法组织在一起的概念。封装的目的......
  • C++引用在本质上是什么,它和指针到底有什么区别?
    参考文章:https://www.bilibili.com/read/cv13541907/对于指针变量P,引用变量Q,以及变量a=10;赋值过程:P=&a;&Q=a;P=&a:将变量a的地址传给指针P。a的地址上存的值是10;P的地址上存值是a的地址;*P:指向的是存在指针P上的地址(a的地址)上的内容,即a的值10。指针P指......
  • 深入理解自动化测试:前置接口数据引用的优化实践
    当进行 自动化测试 编排时,测试步骤间的数据传递是至关重要的。在传统的方式中,一般通过复杂的脚本配置,或者手动复制这些数据,然后再慢慢地粘贴到每个需要它们的地方,以此来实现接口之间的参数传递。这种方式往往效率低下、容易出错并且难以维护,当接口或业务逻辑发生变化时,需要进行大......
  • Python的鸭子类型
    编程语言具有类型概念,例如Python中有数字类型、字符串类型、布尔类型,或者更加复杂的结构,例如元组 tuple 、列表 list 、集合 set 和字典类型 dict 等等。根据如何将类型解析并赋值给各种构造(例如变量,表达式,函数,函数参数等),编程语言可以归类为“鸭子类型”,“结构化类型”或“......
  • 【愚公系列】2023年12月 通用职责分配原则(六)-多态原则(Polymorphism Principle)
    ......
  • 右值引用相关整理
    前言 C++中有“移动语义、右值引用、引用折叠、万能引用、完美转发”等许多概念,本文尽量按照时间顺序,理清这些概念的由来,有什么关系,解决了什么问题。移动语义 首先介绍移动语义的概念。移动语义是C++11引入的,正如移动一词的含义:一个物体从地点A到地点B,从结果上看,物体位置发生......
  • 秦疆的Java课程笔记:71 面向对象 什么是多态
    多态即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。(指向父类或者有关系的类。)//父类=======================================publicclassPerson{}//子类=================================......
  • C++基础 -7- 引用
    ———————引用———————引用就是数据本身不占用空间 ......
  • 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义
    原文链接:https://blog.csdn.net/weixin_45488182/article/details/132537085网上的资料,大都是因为版本号不一致,我检查了很多遍,我这边版本号是12.0.1与12.0.2,config里是12.0.0,应该算是一致的吧。并且清理重新生成后,就不会报这个错。程序可以正常运行了。今天终于解决了这个问题,......
  • 引用不同版本dll
    问题描述一个项目引用不同版本的同一dll,会引发以下报错:未能加载文件或程序集“xxx,Version=x.x.x.x,Culture=neutral,PublicKeyToken=xxxxxxxxxxxx”或它的某一个依赖项。系统找不到指定的文件这里来解决项目中同一dll的多版本问题。解决方式通过配置web.config配置文件(app......