day11_oop_fianl_satic_多态

今日内容

零、 复习昨日
一、final
二、static
三、多态
四、向上转型&向下转型
五、多态应用

零、 复习昨日

0 类封装步骤

  • 属性私有private
  • 提供setget方法

1 继承关键词,继承的好处

  • extends
  • 减少代码重复
  • 为多态做准备

2 子类可以使用父类什么

  • 非私有的属性和方法

3 方法重写的要求

  • 访问修饰符,返回值类型,方法名,参数列表全部一致

4 this和super 总结表格

5 有继承时创建对象的过程

  • 先创建父类对象,再创建子类
  • 类中是先属性初始化再执行构造

一、final

final是一个修饰符,用来修饰类,属性和方法的. 翻译: 最终

修饰类, final class

  • 类不能被继承,其他正常使用

image-20240304100503625

修饰变量/属性, final int a;

  • 修饰属性/变量不再变化,即变成常量,就得有初始值,且不能变化

image-20240304101339104

修饰方法

  • 方法不能被重写

image-20240304101552901

二、static

2.1 介绍

static ,静态的,主要常用是用来修饰

  • 属性
  • 方法

static修饰的属性,方法也会,在内存的特性

  • 加载时机: 随类加载而加载
  • 初始化: 加载时就初始化
  • 位置: 会随着加载出现在方法区中,不在堆中

static修饰的属性和方法,不在堆中,在方法区,且在**内存只有一个,**不管创建多少对象,该类静态属性和方法就只有一个,被该类的所有对象共享


static修饰的方法内,不能使用this

image-20240304110511426

2.2 使用场景

场景1: 当想要某个数据被对象共享时,就定义该属性为static,例如 多个窗口对象共享火车票数据

场景2: static配合final,修饰属性(静态常量)

  • fianl修饰后变常量
  • static修饰后,可以通过类名直接调用

作用: 方便调用,不要创建对象就可以调用

image-20240304112048248

场景3: static修饰方法,通过类名直接调用,方便

例如: Arrays,Math类中全部都是静态方法,可以通过类名直接调用

Arrays.toString()
Arrays.sort()
Math.pow();

2.3 使用总结

什么时候我们需要加static

  1. 当一些属性需要被共享时,给属性设置static
  2. 当某个方法想方便调用时,给方法设置static,可以同类名直接调用
  3. 经验: 测试类,工具类性质的方法可以设置static,其他实体类一般不加

有了static该怎么调用

  • 静态只能调用静态
  • 非静态可以调用非静态也可以调用静态

重写时,静态方法不能重写!!就算子父类一模一样的静态方法也不是重写!!

三、多态

3.1 多态介绍

多态,就是指方法多种状态,换句话说多态就是同一个方法会表现出不同的状态

  • 举例: 豹女奈德丽的技能: 人形时qwe技能和豹形时qwe不一样

3.2 多态前提

要形成多态的这种效果,得满足以下三个条件

  • 继承/实现(有子父类关系)
  • 重写
  • 父类引用指向子类对象(向上转型)

// 父类

public class Animal {public void eat(){System.out.println("动物吃" );}
}

// 子类Dog

public class Dog extends Animal {// 多态条件1继承// 多态条件2重写@Overridepublic void eat() {System.out.println("狗吃骨头" );}
}

// 测试

public class TestPoly {public static void main(String[] args) {// 父类引用指向父类对象// Animal animal = new Animal();// 父类引用指向子类对象Animal animal = new Dog();animal.eat();// 编译看父类,运行看子类// eat方法是子类在执行}
}

3.3 多态什么作用?

多态好处: 减少耦合,提供扩展性

// 现在有需求,设计方法传入一个狗类,执行出狗吃东西

image-20240304150204643

// 现在需求变了,想要表现出猫如何吃东西,该怎么办?

image-20240304150335682

// 假如,要展现动物园所有动物如何吃呢? 再假如后续又来了以前没有的动物,该如何表现吃的行为呢? 简单粗暴的想法,多定义几个方法…

可以,但是很麻烦! 这些写,扩展性不好,来一个需要都需要改代码…

怎么办? 就需要多态!

只需要将方法的参数列表改变成父类即可,调用时传入想要表现的子类对象即可

image-20240304151406540

3.4 多态使用注意事项

  • 父类里面的方法子类没有重写的话,无法体现多态
  • 子类里面有特有方法,向上转型后父类方法也无法调用

// 解释下面代码,给出运行结果

// 问:该程序是否能编译通过?如果可以,输出结果是什么?如果不可以,应该如 何修改?

class Super {public void method() {System.out.println("method() in Super");}public void method(int i) {System.out.println("method(int) in Super");}
}class Sub extends Super {public void method() {System.out.println("method() in Sub");}public void method(String str) {System.out.println("method(String) in Sub");}
}public class TestSuperSub {public static void main(String args[]) {Super s = new Sub( );s.method(10);s.method( );s.method("hello");// 报错,为什么?}
}

四、向上&向下转型

4.1 向上转型

向上转型: 父类引用指向子类对象 Animal a = new Dog();

将Dog类(子类)的对象,包装成Animal类(父类)类型的对象, 子类变父类,

也可以理解为类型转换: 小转大

为什么需要向上转型? 就是为了多态效果,方便写代码的

向上转型后需要注意

  • 父类引用只能调用父类中有的方法(编译看父类)
  • 真正执行时看子类
image-20240304162956037

4.2 向下转型

什么是向下转型?

向上转型是子类对象变父类对象,那

向下转型就是 父类对象变子类对象,类似这样 Dog dog = new Animal();

但是这是类型转换中 “大转小” , 需要强制进行 Dog dog = **(Dog)**new Animal();

这就是向下转型

需要注意,向下转型不一定成功! 想要成功先向上再向下

image-20240304164059399

为什么需要向下转型?是因为向上转型后父类无法调用子类特有方法,所以需要再变为子类调用子类特有方法

image-20240304164332244

五、多态的应用场景

方法参数列表是父类类型,调用方法传参数时,传入子类对象,运行时出现各自子类效果

image-20240304165322466

方法返回值是父类类型

image-20240304170000199

数组类型是父类类型,

  • 比如形状数组,存储形状子类(圆形,矩形,正方形)
  • 比如员工数组,存储员工子类(底薪员工,小时工,销售员工)

image-20240304165452474

六、总结

关于final,重点是修饰变量为常量,不可改变这个点

关于static,重点是方便调用,类名可以直接调用属性和方法,然后属性是只有一个被共享!

关于多态,要记住

  • 语法特征: 继承,重写,向上转型
  • 代码效果: 编译看父类,运行看子类
  • 向下转型是什么?怎么转不报错?
  • 熟练使用场景即可

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

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

相关文章

总结:直径测量的发展历程!在线测径仪已成主要方式!

测量在生活、生产和科学探究中扮演着至关重要的角色。从古至今,人们对测量的探索从未停止。而外径作为一种基础的几何尺寸,其测量也经过了多代发展,直到至今被广泛应用到工业生产中的在线测径仪。本文就来介绍一下外径测量的发展历程&#xf…

【pyinstaller打包记录】Linux系统打包可执行文件后,onnxruntime报警告(Init provider bridge failed)

简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件(可执行程序)的工具。它能够将 Python 代码和其相关的依赖项(包括 Python 解释器、依赖的模块、库文件等)打包成一个独立的可执行文件,方便在不同环境中运行…

【Sql Server】存储过程的创建和使用事务,常见运用场景,以及目前现状

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

浅析扩散模型与图像生成【应用篇】(五)——SDEdit

5. SDEdit: Guided Image Synthesis and Editing With Stochastic Differential Equations 该文提出一种基于SDE扩散模型的引导图像生成和编辑方法。通过使用者在原图上给出一些引导,比如在图像上涂鸦或者增加一个图块,甚至可以不给定原图,直…

如何从 WordPress 中的静态资源中删除查询字符串

今天有一个客户来问询,hostease主机创建的WordPress站点,在GTMetrix或Pingdom进行网站速度测试,看到有关查询字符串的警告。如果不想看到查询字符串的警告,要如何处理呢?我们测试,可以通过一些处理满足这个需求。我们…

三整数排序问题的解题逻辑

【题目描述】 输入3个整数,从小到大排序后输出。 【样例输入】 20 7 33 【样例输出】 7 20 33 【解析】 本题解法大概有3种: 1、穷举条件法。 此方法先判断a、b、c大小的所有可能,再根据各种可能性输出不同的排序。 思路是先判断a、…

C++17中的类模板参数推导

在C17之前,必须明确指出类模板的所有参数。自从C17起必须指明类模板参数的限制被放宽了。通过使用类模板参数推导(Class Template Argument Deduction(CTAD)),只要编译器能根据初始值推导出所有模板参数,那么就可以不指明参数。 C17中的类模板…

记录一次排查负载均衡不能创建的排查过程

故障现象,某云上,运维同事在创建负载均衡的时候,发现可以创建资源,但是创建完之后,不显示对应的负载均衡。 创建负载均衡时候,按f12发现console有如下报错 后来请后端网络同事排查日志发现,是后…

中科大计网学习记录笔记(十七):拥塞控制原理 | TCP 拥塞控制

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

论文学习—Model-based Adversarial Meta-Reinforcement Learning

Model-based Adversarial Meta-Reinforcement Learning Abstract1. Introduction2. Related work3 Preliminaries基于模型的强化学习(MBRL):区别和联系: 4 Model-based Adversarial Meta-Reinforcement Learning4.1 Formulation 4.2 Computin…

LeetCode 每日一题 Day 88 - 94

2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子 2 * i 和右孩子 2 * i 1 。 树中每个节点都有一个值&a…

好书推荐丨细说PyTorch深度学习:理论、算法、模型与编程实现

文章目录 写在前面深度学习推荐图书内容简介作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本深度学习的全新正版书籍,感兴趣的小伙伴快来看看吧~ 深度学习 深度学习是机器学习的一个分支,它模仿人脑神经网络的工作原理进行复杂的…

蓝桥杯练习系统(算法训练)ALGO-986 藏匿的刺客

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 强大的kAc建立了强大的帝国,但人民深受其学霸及23文化的压迫,于是勇敢的鹏决心反抗。   kAc帝国防…

linux kernel物理内存概述(二)

目录 物理内存数据结构 设备数物理内存描述 物理内存映射 map_kernel map_mem zone数据结构 zone类型 物理内存数据结构 站在处理器角度,管理物理内存的最小单位是页面。使用page数据结构描述,通常默认大小4kB,采用mem_map[]数组来存…

学习java第一天(下载并配置环境+写第一个java程序)

一.安装 1.下载 直接去官网上选择与你电脑符合的版本下载 官网链接Java Archive Downloads - Java SE 8u211 and later (拿我的为例 Windows x64版本) ​ 2.然后安装好exe(要让自己知道在哪) 3.配置环境 大佬链接&#xff1…

“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】

“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】 前言预备知识1.定时器介绍11.1软件延时的优缺点1.2定时器工作原理1.3定时器的分类1.4 STM32F103C8T6定时器资源1.5通用定时器介绍 2.定时器介绍22.1定时器计数模式2.2定时器时钟源…

【VTKExamples::PolyData】第四十六期 Reflection

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例Reflection,并解析接口vtkReflectionFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Reflection …

Docker容器详解

一、概述 1.1 基本概念: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚…

SpringCloud 各自组件的停更/升级/替换

一、停更不停用 现在 SpringCloud 不再修复 bug,也不再接收合并请求,也不再发布新版本,但是目前还是可以继续使用的。 二、以前的组件 以前 SpringCloud 常用的组件如下图,服务的注册和发现使用 Eureka,服务的负载和调…

深入理解c指针(七)

目录 十、回调函数和qsort函数 1、回调函数 2、简单介绍size_t 数据类型 3、qsort 排序函数 3.1 qsort函数简单举例1(升序排序) 3.2 qsort函数简单举例2(字符串长度排序) 3.3 简单讲解 -> 操作符 3.4 常见符号的ASCII…