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重写
    @Override
    public 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,重点是方便调用,类名可以直接调用属性和方法,然后属性是只有一个被共享!

关于多态,要记住

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络机顶盒哪个好?数码小编分享网络机顶盒排名

每次在挑选网络机顶盒的时候,很多朋友会咨询我的意见,最近每天都会收到相关的咨询,不知道网络机顶哪个好,我这次要分享的就是业内公认网络机顶盒排名,入围的几个品牌都是非常出色的,想买网络机顶盒的可以从…

亚信安慧AntDB:数智化转型的可持续动能

AntDB致力于为企业提供可持续发展的数据支持,其使命在于助力企业更好地适应不断变化的数智化时代。作为一款性能出色、可靠稳定的分布式数据库系统,AntDB为企业打造了一个高效、安全、灵活的数据管理平台,不仅拥有强大的数据处理和分析能力&a…

谁才是“内卷”之王?众多洗地机品牌哪家清洁力最强?清洁最干净?

在如今快节奏的生活中,家庭清洁工作愈发显得繁琐而耗时。添可洗地机凭借其高效的一体化清洁功能和智能化操作,为现代家庭生活带来了极大的便利。面对众多款品牌洗地机型号,消费者不禁会问:哪家洗地机清洁力最强?在性能…

IO(Linux)

文件系统 前言1. 回顾关于C文件部分函数2. 一些文件知识的共识3. 相对路径4. fwrite中的\0 一、文件描述符fd1. 概念2. 系统调用① open 和 close② write③ read 和 lseek 3. 缺省打开的fd 二、重定向1. 原理2. 系统调用dup23. stdout和stderr的区别4. 进程替换和原来进程文件…

百度AI,能否“投”出未来?

图片|freeflo.ai ©自象限原创 作者丨程心、罗辑 2月28日,百度发布了2023年四季度财报及全年未经审计的财务报告,AI大模型带来的收入和利润成为最大的亮点。 财报显示,2023年百度集团总营收达1345.98亿元,同比增…

java数据结构与算法刷题-----LeetCode337. 打家劫舍 III

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 动态规划深度优先1.1 解题思路和细节2.2 代码实现 很多人觉得…

告别信息搜寻烦恼:用fastgpt快速部署国内大模型知识库助手

Docker Compose 快速部署 使用 Docker Compose 快速部署 FastGPT 推荐配置 环境最低配置(单节点)推荐配置测试2c2g2c4g100w 组向量4c8g 50GB4c16g 50GB500w 组向量8c32g16c64g 200GB 部署架构图 1. 准备好代理环境(国外服务器可忽略&…

web游戏-飞机大战

H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的订阅后,私信本人,发源码,含60小游戏源码。如五子棋、象棋、植物大战僵尸、贪吃蛇、飞机大战、坦克大战、开心消消乐、扑鱼达人、扫雷…

STM32自学☞I2C

这里只是大体介绍,具体的可参考STM32数据手册

Python算法100例-3.2 水仙花数

完整源代码项目地址,关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展7.巧用字符串技巧 1.问题描述 输出所有的“水仙花数”。所谓的“水仙花数”是指一个三位数,其各位数字的立方和等于该…

[C语言]——C语言常见概念(3)

目录 一.字符和ASCII编码 二.字符串和\0 三.转义字符 四.语句和语句分类 1.空语句 2.表达式语句 3.函数调用语句 4.复合语句 5.控制语句 五.注释 1.注释的2种形式 1.1 /**/ 的形式 1.2 // 的形式 2.注释会被替换 一.字符和ASCII编码 在键盘上可以敲出各种字符&am…

【UE Niagara】纳米蠕虫效果

效果 步骤 1. 新建一个Niagara系统,选择一个空模板,这里命名为“NS_Worm” 打开“NS_Worm”,重命名发射器为“Leader” 先添加“Spawn Burst Instantaneous”模块来单次生成粒子 为了让粒子持续停留在关卡中,需要在“Particle St…

MybatisPlus的使用(一)--基本配置与无条件查询

创建测试用的数据库 CREATE DATABASE mybatis_plus /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use mybatis_plus; CREATE TABLE user ( id bigint(20) NOT NULL COMMENT 主键ID, name varchar(30) DEFAULT NULL COMMENT 姓名 , age int(11) DEFAULT NULL COMMENT 年龄 , em…

JavaWeb - 1 - 概述

一.什么是Web? Web:全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的网站 二.Web网站的工作流程 三.Web网站的开发模式 3.1 前后端分离开发(主流) 3.2 混合开发…

thymeleaf 一个莫名其妙的错误提示 org.attoparser.ParseException

thymeleaf 一个莫名其妙的错误提示 介绍 开发过程中遇到一个莫名奇妙的错误,一时竟然不知道怎么解决,找官网也没有找到 问题 页面显示 错误日志 org.attoparser.ParseException: (Line 96, Column 5) Malformed markup: Attribute “}” appears m…

羊大师揭秘羊奶将成为,健康新选择

羊大师揭秘羊奶将成为,健康新选择 羊奶作为一种传统的营养食品,已经在全球范围内受到了广泛的关注和认可。随着人们对健康生活的追求和对食品安全的重视,羊奶正逐渐成为健康的新选择。 羊奶的营养价值得到了科学的验证。羊奶中含有丰富的蛋…

【深度学习笔记】5_5 LeNet

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 5.5 卷积神经网络(LeNet) 在3.9节(多层感知机的从零开始实现)里我们构造了一个含单隐藏…

飞书文档批量导出

背景需求 最近所参与的项目即将结项,需要将飞书中的产品需求文档(PRD)交付给甲方,由于文档较多,大概有两百多个,一个一个的下载导出,太麻烦了(PS:本人比较懒)…

ruoyi-nbcio-plus的Vue3前端升级组件后出现的问题(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址: http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbach…

Jenkins 安装

目录 1、部署 Jenkins 安装配置 Jenkins 解锁 Jenkins 安装 Jenkins 插件 创建管理员账号 手动安装插件 2、Jenkins 从 GitLat 拉取代码 安装 Jenkins 插件 在 node-16 上生成密钥对 把公钥配置到 gitlab 上 把 root 用户私钥配置到 jenkins 上 Jenkins 创建一个任务…