4. java——多态(java巅峰设计,超越了C++的理解,取其精华,去其糟粕)

news2024/11/22 7:28:39

多态指的是同—个行为具有多个不同表现形式

。是指—个类实例(对象)的相同方法在不同情形下具有 不同表现形式。封装和继承是多态的基础,也就是说,多态只是—种表现形式而已。一个对象,同一个方法不同形态,方法必须重写
如何实现多态?多态的实现具有三种充要条件

继承 —— extends
重写父类方法——@override
父类引用指向子类对象
——Father p1 = new Son( );

比如下面这段代码

1   public  class  Fruit  {
2
3           int  num;
4
5           public  void  eat(){
6           System .out .println("eat  Fruit");
7                }
8        }
9
10      public  class  Apple  extends  Fruit{
11
12                @Override
13                 public  void  eat()  {
14                       super .num  =  10;
15                         System .out .println("eat  "  +  num  +  "  Apple");
16                }
17
18                 public  static  void  main(String[]  args)  {
19                          Fruit  fruit  =  new  Apple();
20                          fruit .eat();
21                }
22        }

你可以发现 main 方法中有—个很神奇的地方, Fruit fruit = new Apple() , Fruit 类型的对象
竟然指向了 Apple 对象的引用,这其实就是多态 -> 父类引用指向子类对象,因为 Apple 继承于 Fruit,并且重写了 eat 方法,所以能够表现出来多种状态的形式

图解

在这里插入图片描述

再举一个经典例子,关于员工类和经理类的案例(选自java核心技术卷I中第五章)

import java.util.Objects;

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

          var boss =new Manager("刘备",10000);
          boss.setBonus(2000);//刘老板的红利

          var staff=new Employee[3];  //先定义一个Employee的数组 ,var是可变类型,staff全部指向了Employee类型对象
          staff[0]=boss; //把boss(经理类对象)赋值给第一个堆区员工数组第一个元素。
          staff[1]=new Employee("关羽",8000); //其他两个都是普通员工,并且进行初始化构造
          staff[2]=new Employee("张飞",6000);

          for (Employee e:staff)
          {
              System.out.println("姓名:"+e.getName()+"  工资:"+e.getSalary());
          }

        Employee e1=new Employee("aaa",122);
        Manager m1=new Manager("AAA",12312);

        Employee e2=new Manager("ddd",12);//向上转型
        //Manager m2 =new Employee("hhh",123);//不兼容类型,实际上为Employee,需要Manager,你实际开辟的空间为Employee,但是数据类型是Manager,
        // 因为继承树:Manager > Employee ,Manager 比 Employee功能更多,条件更苛刻 ,开辟出的空间Employee无法容纳下你实际声明的数据类型Manager,——向下转型是几乎失败的

        //右边是提供的类型,左边是需要的类型,左边不可以大于右边,需求不可以大于供给。强制转型和你是谁没有关系。
        Manager p=(Employee)m1;//error
        Manager p1= (Employee)e2;//error
        Manager p2= (Employee)e1;//error

        Employee p3 =(Employee)e2;//全部正确
        Employee p4 =(Manager)e1;
        Employee p5 =(Employee)e1;
        Employee p6 =(Employee)m1;
        Employee p7=(Manager)e2;
        Employee p8 =(Manager)m1;

    }
}
public class Employee
{
    private int salary;

    private String name;

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Employee(String name,int salary) {
        this.salary = salary;
        this.name = name;
    }
}

public class Manager extends Employee{
    private int bonus;
    public Manager(String name,int salary)
    {
        super(name,salary);
        bonus=0;
    }

    public int getSalary()
    {
        int baseSalary =super.getSalary();
    return (baseSalary + bonus);
    }

    public void setBonus(int b)
    {
        bonus =b;
    }
}

//右边是提供的类型,左边是需要的类型,左边不可以大于右边,需求不可以大于供给。强制转型和你是谁没有关系。

Manager p=(Employee)m1;//error
Manager p1= (Employee)e2;//error
Manager p2= (Employee)e1;//error

    Employee p3 =(Employee)e2;//全部正确
    Employee p4 =(Manager)e1;
    Employee p5 =(Employee)e1;
    Employee p6 =(Employee)m1;
    Employee p7=(Manager)e2;
    Employee p8 =(Manager)m1;

垃圾代码,阿猫阿狗的故事

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

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

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

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
        animal1.sound();  // 输出 "Dog barks"
        animal2.sound();  // 输出 "Cat meows"
    }
}

拓展:

在Java中,var 是一个关键字,它在Java 10及其之后的版本中引入。var 关键字用于声明局部变量,并且可以根据变量的初始化值自动推断出变量的数据类型。

使用 var 关键字可以简化代码,并且使代码更具可读性。通过自动推断数据类型,可以避免在声明变量时重复书写相同的类型,并且可以更加灵活地处理不同类型的变量。

示例代码:

var message = "Hello, World!"; // 推断 message 为 String 类型
var count = 10; // 推断 count 为 int 类型
var pi = 3.14; // 推断 pi 为 double 类型

需要注意的是,一旦使用 var 声明一个变量,该变量的类型就被确定下来,并且不能再改变。编译器会根据变量的初始化值推断出最合适的类型,并且编译后的代码中仍然会有明确的类型。

另外,尽管 var 关键字可以简化代码,但也要注意在可读性方面的平衡。在某些情况下,显式地声明变量的类型可能更有助于代码的可读性和维护性。因此,在使用 var 关键字时需要适度使用,权衡好代码简洁性与可读性之间的关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1333596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

reactor的原理与实现

网络模型 前情回顾服务器模型 Reactor和 ProactorReactor模型Proactor模型同步I/O模拟Poractor模型Libevent,libev,libuv优先级事件循环线程安全 前情回顾 网络IO,会涉及到两个系统对象:   一个是用户空间调用的进程或线程   …

基于IPP-FFT的线性调频Z(Chirp-Z,CZT)的C++类库封装并导出为dll(固定接口支持更新)

上一篇分析了三种不同导出C++类方法的优缺点,同时也讲了如何基于IPP库将FFT函数封装为C++类库,并导出为支持更新的dll库供他人调用。 在此基础上,结合前面的CZT的原理及代码实现,可以很容易将CZT变换也封装为C++类库并导出为dll,关于CZT的原理和实现,如有问题请参考: …

增量式旋转编码器在STM32平台上的应用

背景 旋钮是仪器仪表上一种常见的输入设备,它的内部是一个旋转编码器,知乎上的这篇科普文章对其工作原理做了深入浅出的介绍。 我们公司的功率分析仪的前面板也用到了该类设备,最近前面板的MCU从MSP430切换成了STM32,因此我要将…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-1x111

如上表所示,MOE1,OSSR1,CCxE1,CCxNE1时,OCx与OCxN对应端口的输出状态取决于OCx_REF与极性选择(CCxP,CCxNP) 死区。 -------------------------------------------------------------…

Python学习路线 - Python语言基础入门 - Python基础综合案例 - 数据可视化 - 动态柱状图

Python学习路线 - Python语言基础入门 - Python基础综合案例 - 数据可视化 - 动态柱状图 基础柱状图构建案例效果通过Bar构建基础柱状图反转x和y轴数值标签在右侧 基础时间线柱状图绘制创建时间线创建时间线自动播放时间线设置主题 动态GDP柱状图绘制需求分析列表的sort方法带名…

【SD】差异值 生成 同一人物 制作 表情包 【1】

说明:只对AI生成的人物,效果稳定。 Reference差异值 生成表情 首先生成一张图片。 测试命令:1 man,chibi,full body, 模型:envyclarityxl02_v10.safetensors [f6c13197db] 种子:2704867166 》》测试命令&#xff1a…

java八股 spring + mybatis

Spring常用注解(绝对经典)_spring注解-CSDN博客 框架篇-02-Spring-单例bean是线程安全的吗_哔哩哔哩_bilibili 1.spring.bean 单例 线程不安全 2.AOP 项目里可以说记录用户登录日志,利用request去获取姓名、ip、、请求方式、url&#xff0…

NUAA-云计算-考试

19级期末 问题 答案: md格式 自己想办法看 # 随堂测验#### 一、请简述GFS 的系统架构和特点。**1. 系统架构**- GFS将整个系统节点分为三类角色:- Client(客户端):Client是GFS提供给应用程序的访问接口,以库文件的…

Oracle 学习(1)

Oracle简介 Oracle是殷墟(yīn Xu)出土的甲骨文(oracle bone inscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思。Oracle公司成立于1977年,总部位于美国加州,是世界领先的信息管…

我在代码随想录|写代码Day-Day之总结篇

我是用笔手写的我觉得这样可以对个人记忆会更好,而且理解更深解释也更清楚 下面是手写笔记 总结部分----- 第一章 二分 二分模版 图片可能反了下不过没有关系 图形打印模版题 第二章 链表 链表基本操作和疑问 链表代码操作和解析----5大操作 删除部分 对结点的操作 反了反了…

LeetCode——1954. 收集足够苹果的最小花园周长

通过万岁!!! 题目:这个题目比较复杂,就是给你一个坐标轴,然后让你以0,0为中心选择一个边长为整数的正方形,使得正方形中所有点坐标的绝对值之和要大于给定的neededApples。但是我们需要输出的是…

案例167:基于微信小程序的校园失物招领小程序

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

Node.js教程-express框架

概述 Express是基于Node.js平台(建立在Node.js内置的http模块上),快速、开放、极简的Web开发框架。 中文官网 http://www.expressjs.com.cn/。 Github地址:https://github.com/orgs/expressjs。 Express核心特性: 可设置中间件来响应 HTTP…

关于“Python”的核心知识点整理大全40

目录 alien_invasion.py game_functions.py 14.3.3 在外星人被消灭时更新得分 settings.py game_functions.py game_functions.py alien_invasion.py 14.3.4 将消灭的每个外星人的点数都计入得分 game_functions.py 14.3.5 提高点数 settings.py settings.py 注意…

【Java JVM】Java 实例对象的访问定位

Java 程序会通过栈上的 reference 数据来操作堆上的具体对象。 但是 reference 类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用, 并没有定义这个引用应该通过什么方式去定位, 访问到堆中对象的具体位置, 所以对象访问方式也是由虚拟机实现而定的,主流…

iApp最新版无服务器多功能软件库源码

无需服务器的多功能软件库源码分享,仅需添加一个后台应用和一个文档即可 使用教程如下: 在浏览器中打开理想后台地址:http://apps.xiaofei.run/user/ 如果没有账号,请注册一个免费账号。 登录账号后,添加一个后台应…

web架构师编辑器内容-HTML2Canvas 截图的原理

HTML2Canvas 截图的原理 目的:一个canvas元素,上面有绘制一系列的HTML节点 局限:canvas中没法添加具体的Html节点,它只是一张画布 通过canvas.getContext(‘2d’)可以拿到canvas提供的2D渲染上下文,然后在里面绘制形…

洛谷 P3397 地毯 刷题笔记 二维差分矩阵

P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 方法1 欺负数据小 暴力水过 #include<iostream> using namespace std; const int N1010; int a[N][N]; int main(){ int n,m; cin>>n>>m; for(int i0;i<m;i){ int x1,y1,…

基于STM32的DS1302实时时钟模块应用

DS1302是一款低功耗的实时时钟芯片&#xff0c;被广泛应用于各种电子产品中。它具有准确计时、多种时间格式表示、定时报警等功能&#xff0c;适用于记录时间、日期和闹钟。在本文中&#xff0c;我们将介绍如何在基于STM32的开发环境中使用DS1302实时时钟模块&#xff0c;并给出…

【重点!!!】【单调栈】84.柱状图中最大矩形

题目 法1&#xff1a;单调栈[原版] O(N)O(N) 必须掌握算法&#xff01;&#xff01;&#xff01; class Solution {public int largestRectangleArea(int[] heights) {int n heights.length, res 0;int[] leftMin new int[n], rightMin new int[n];Stack<Integer>…