java面对对象编程-多态
介绍
方法的多态
多态是在继承,重载,重写的基础上实现的
我们可以看看这个代码
package b;public class main_ {public static void main(String[] args) {
// graduate gra=new graduate();
// gra.cry();//这个时候,子类的cry方法就重写了父类的方法aa a=new aa();System.out.println(a.sun(1,2,3));System.out.println(a.sun(1,3));}}
class father{//父类。private void say() {System.out.println("b say()方法被调用");}}
class aa extends father_{//子类继承父类public int sun(int n1,int n2) {//和下面的sum构成方法重载return n1+n2;}public int sun(int n1,int n2,int n3) {//和下面的sum构成方法重载return n1+n2+n3;}}
用方法的重载
方法的重写
我现在在子类和父类中都加上say方法,并创建对象调用,虽然都是say 方法,但调用的对象不同
package b;public class main_ {public static void main(String[] args) {
// graduate gra=new graduate();
// gra.cry();//这个时候,子类的cry方法就重写了父类的方法aa a=new aa();System.out.println(a.sun(1,2,3));System.out.println(a.sun(1,3));father b=new father();b.say();a.say();}}
class father{//父类。public void say() {System.out.println("b say()方法被调用");}}
class aa extends father_{//子类继承父类public int sun(int n1,int n2) {//和下面的sum构成方法重载return n1+n2;}public int sun(int n1,int n2,int n3) {//和下面的sum构成方法重载return n1+n2+n3;}public void say() {System.out.println("a say()方法被调用");}}
多态的具体表现。
我们先来看看编译类型和运行类型
- 编译时类型:也被称为静态类型,是变量在声明时的类型或者可以理解为是引用的类型。编译时类型在编译期确定,并且在程序运行过程中不会发生改变。编译器在编译时就会检查对应的类型规则。
Animal animal = new Dog(); // 这里animal的编译时类型就是Animal
- 运行时类型:也被称为动态类型,在程序运行过程中动态绑定的类型,即实际的对象类型。运行时类型可能会在运行期改变,具体的类型是在运行时确定的。、
Animal animal = new Dog(); // 这里animal的运行时类型就是Dog animal = new Cat(); // 这里animal的运行时类型变为Cat
在堆栈中的
在`Animal myDog = new Dog();`这句代码中,涉及到了两部分的内存分配:堆内存和栈内存,他们的用途和特性各不相同。 1. 堆内存(Heap): 这是存放所有对象实例以及数组的地方。在Java中,通过`new`关键字创建的对象或数组都会在堆中分配内存。所以,`new Dog()`创建的新的Dog对象就存放在堆内存中。 2. 栈内存(Stack):存放了基本类型的变量(int, double, float, boolean, char等)和对象引用变量。每个线程运行时都有自己的栈,栈中的数据只在当前线程中有效。所以,`myDog`是一个引用类型的变量,它存放在栈内存中。它持有的是堆内存中的`Dog`对象的引用(可以理解为指向堆内存中`Dog`对象的地址)。 因此,`Animal myDog = new Dog();`这句代码,一个`Dog`类型的对象实例被创建在堆内存中,`myDog`这个引用变量被创建在栈内存中,并且`myDog`持有了这个`Dog`实例的引用。这样,通过`myDog`, 我们就可以指向和操作这个`Dog`实例了。 这种处理方式的一个重要理解是,当`myDog`的作用域结束或者被设为null,只是栈内存中的引用消失了,但是堆内存中的`Dog`对象还在,除非没有其他的引用指向这个`Dog`对象,那它就会被认为是垃圾,等待垃圾回收器在恰当的时候删除它。
真正理解
在这段代码`Animal myDog = new Dog();`中,`Animal`是一个类,在Java中被用作数据类型。在这个上下文中,它标识了`myDog`引用变量应该引用的对象类型。它并不直接占据堆或栈中的空间,它存在于源代码以及编译后的字节码中。 具体的说,`Animal`是一个reference(引用)类型,而`myDog`是一个reference(引用)变量,它的类型就是`Animal`。`myDog`变量存储在栈内存里,而真正的对象实例`new Dog()`则存储在堆内存里。 `Animal`的存在,影响的是`myDog`这个引用变量可以指向堆内存中的哪些对象。准确地说,`myDog`可以指向堆内存中的`Animal`对象,也可以指向任何一个`Animal`子类的对象(如这里的`Dog`对象)。 因此,`Animal`并不直接占据内存,而是确定了`myDog`引用变量可以引用哪种类型的对象。同时,在编译期,它也决定了可以通过`myDog`变量调用哪些方法和访问哪些字段。
多态代码
public class Animal {public void sound(){System.out.println("动物发出声音");}
}public class Dog extends Animal {public void sound(){System.out.println("汪汪汪");}
}public class Cat extends Animal {public void sound(){System.out.println("喵喵喵");}
}public class Main {public static void main(String[] args) {Animal myDog = new Dog();Animal myCat = new Cat();myDog.sound();myCat.sound();}
}
多态的动物
小提示
在java中 public void feed(Dog dog,Bone bone)其中的Dog dog,Bone bone是什么
在这个方法定义中:
- public void feed(Dog dog, Bone bone)
- feed是方法名
- public表示该方法可在任何位置访问
- void表示该方法没有返回值
- Dog dog, Bone bone 是该方法的参数(parameters)
- Dog表示参数的类型为Dog类
- dog是参数名,表示传入的实参对象会以dog这个名字在方法内访问
- Bone bone表示下一个参数的类型为Bone类,名称为bone
所以简单总结:
- Dog dog, Bone bone定义了这个feed方法需要两个参数
- 第一个参数是Dog类型,名称为dog
- 第二个参数是Bone类型,名称为bone
- 这两个参数在方法内通过dog和bone这个名字来访问传入的实参对象所以这个方法定义表示,feed方法需要传入两个对象,一个是Dog类型,一个是Bone类型,然后在方法内部就可以通过dog和bone来操作这两个对象了。
相关文章:

java面对对象编程-多态
介绍 方法的多态 多态是在继承,重载,重写的基础上实现的 我们可以看看这个代码 package b;public class main_ {public static void main(String[] args) { // graduate granew graduate(); // gra.cry();//这个时候,子类的cry方法就重写…...

【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用
大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言随机查询语…...

基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善
前言 紧接上篇->基于C#开发web网页管理系统模板流程-登录界面和主界面_c#的网页编程-CSDN博客 已经完成了登录界面和主界面,本篇将完善主界面的管理员录入和编辑功能,事实上管理员录入和编辑的设计套路适用于所有静态表的录入和编辑 首先还是介绍一下…...

K8s证书过期处理
问题描述 本地有一个1master2worker的k8s集群,今天启动VMware虚拟机之后发现api-server没有起来,docker一直退出,这个集群是使用kubeadm安装的。 于是kubectl logs查看了日志,发现证书过期了 解决方案: 查看证书 #…...

刷题之路径总和Ⅲ(leetcode)
路径总和Ⅲ 这题和和《为K的数组》思路一致,也是用前缀表。 代码调试过,所以还加一部分用前序遍历数组和中序遍历数组构造二叉树的代码。 #include<vector> #include<unordered_map> #include<iostream> using namespace std; //Def…...
MongoDB 原子操作:确保数据一致性和完整性的关键
在 MongoDB 中,原子操作是指可以一次性、不可分割地执行的数据库操作。这些操作能够保证在多个并发操作中不会出现数据不一致或者丢失的情况,确保数据库的数据完整性和一致性。 基本语法 MongoDB 的原子操作通常与更新操作相关,其基本语法如…...
2024上半年软考高级系统架构设计师回顾
本博客地址:https://security.blog.csdn.net/article/details/139238685 2024年上半年软考在5月25-26日举行,趁着时间刚过去记忆还在,简单写一点总结。 关于考试形式:上机考试(以后也都是机考)࿰…...
SQL注入绕过技术深度解析与防御策略
引言 在Web安全领域,SQL注入攻击一直是一个棘手的问题。攻击者通过SQL注入手段获取敏感数据、执行恶意操作,甚至完全控制系统。尽管许多防御措施已被广泛采用,但攻击者仍不断开发新的绕过技术。本文将深度解析SQL注入的绕过技术,…...
Redis教程(十六):Redis的缓存穿透、缓存击穿、缓存雪崩
传送门:Redis教程汇总篇,让你从入门到精通 缓存穿透 描述 用户需要查询一个数据,例如要查一张ASSET_CODE 999999的卡片,查询redis中没有,就直接去请求数据库,数据库中也不存在对应的数据,返回…...
如何实现一个高效的单向链表逆序输出?
实现单向链表逆序输出的关键点有两个: 反转链表本身 遍历反转后的链表并输出首先,我们来看如何反转链表: class Node:def __init__(self, data):self.data dataself.next Nonedef reverse_list(head):"""反转单向链表"""prev Nonecurrent h…...
使用 Go 实现 HelloWorld 程序,并分析其结构
在学习任何新的编程语言时,编写一个 “Hello, World” 程序通常是最初的入门步骤。这不仅是一个传统,也是一种快速了解语言基本语法和运行机制的有效方法。对于 Go 语言,这个过程不仅可以帮助新手快速入门,还提供了一个窗口&#…...
机器学习:在Python中sklearn库的使用,纯干货!12个小时的整理!
无监督学习是在没有标签的数据上训练的。其主要目的可能包括聚类、降维、生成模型等。 以下是 6 个重要的无监督学习算法,这些算法都可以通过使用sklearn(Scikit-learn)库在Python中很好地处理: 目录 K-Means 聚类 层次聚类 …...
XSS 攻击
XSS 攻击简介 定义: XSS(跨站脚本攻击)是一种网络安全漏洞,攻击者通过在 Web 页面中注入恶意代码,利用用户的浏览器执行这些恶意脚本,从而实施攻击。 解决方案: 过滤用户输入: 对…...
.Net Core 中间件与过滤器
过滤器这个是.Net MVC旧有的功能,中间件这个概念是新出的, ASP.NET Core只是完成了HTTP请求调度、报文解析等必要的工作,像检查用户身份、设置缓存报文头等操作都是在中间件中完成,中间件就是ASP.NET Core的一个组件,…...
【ARMv7-A】——WFI(wait for interrupt)
文章目录 WFI基本原理使用场景多任务模型注意事项代码实例linux 内核中的 WFI 指令不使用 WFI 指令测试使用 WFI 指令测试WFI WFI 即 Wait for interrupt,常用于低功耗。 WFI (Wait for interrupt) 和 WFE (Wait for event) 是两个让 ARM 核进入 low-power standby 模式的指…...

92. 反转链表 II
题目描述 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left < right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 示例 1: 输入:head [1,2,3,4,5], left 2, right 4 输出&#…...

Modbus工业网关
随着工业自动化程度的不断提高,设备之间的数据通信与交互变得至关重要。在这一背景下,Modbus协议凭借其简单、可靠、开放的特点,成为了工业自动化领域中最常用的通信协议之一。而HiWoo Box网关作为一款支持Modbus协议的工业网关设备ÿ…...

c++——模板初始识
1.函数模板 我们经常用到Swap函数交换两个值。由于需要交换的数据的类型不同,我们就需要写不同参数类型的同名函数,也就是函数重载: 然而这三个函数的逻辑是一样的,写这么多有些多此一举,通过函数模版可以写一个通用…...

帆软生成csv文件
帆软官网提供了导出csv文件的插件,需要下载指定版本的插件 请选择具体的详情点击官网介绍:文档介绍 插件地址:插件地址...

12.Redis之补充类型渐进式遍历
1.stream 官方文档的意思, 就是 stream 类型就可以用来模拟实现这种事件传播的机制~~stream 就是一个队列(阻塞队列)redis 作为一个消息队列的重要支撑属于是 List blpop/brpop 升级版本.用于做消息队列 2.geospatial 用来存储坐标 (经纬度)存储一些点之后,就可以让用户给定…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...