day11_oop_fianl_satic_多态

news2024/11/18 5:30:21

今日内容

零、 复习昨日
一、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,重点是方便调用,类名可以直接调用属性和方法,然后属性是只有一个被共享!

关于多态,要记住

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

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

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

相关文章

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

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

vue项目中使用antvX6新手教程,附demo案例讲解(可拖拽流程图、网络拓扑图)

前言: 之前分别做了vue2和vue3项目里的网络拓扑图功能,发现对antv X6的讲解博客比较少,最近终于得闲码一篇了! 需求: 用户可以自己拖拽节点,节点之间可以随意连线,保存拓扑图数据后传给后端&…

恒峰|智能高压森林应急消防泵|森林防火的守护神

在大自然中,森林是生态系统的重要组成部分,它们为我们提供氧气、净化空气、保持水源、防止土壤侵蚀等重要功能。然而,森林火灾却时常威胁着这些宝贵资源的安全。为了应对这一挑战,我们研制出了一种名为“智能高压森林应急消防泵”…

游戏寻路之A*算法(GUI演示)

一、A*算法介绍 A*算法是一种路径搜索算法,用于在图形网络中找到最短路径。它结合了Dijkstra算法和启发式搜索的思想,通过综合利用已知的最短路径和估计的最短路径来优化搜索过程。在游戏自动寻路得到广泛应用。 二、A*算法的基本思想 在图形网络中选择一个起点和终点。维护…

OSPF 普通区域stub实验简述

1、OSPF 普通区域stub配置 实验拓扑图 r1: sys sysname r1 undo info enable int loopb 0 ip add 1.1.1.1 32 quit int e0/0/0 ip add 172.16.1.1 24 quit ospf 1 area 0.0.0.1 network 172.16.1.0 0.0.0.255 network 1.1.1.1 0.0.0.0 Stub 配置普通区域 ret r6: sys sysnam…

不愧是华为出来的,太厉害了...

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 实习去了博彦科技(外包),做的…

认识AJAX

一、什么是Ajax? 有跳转就是同步,无跳转就是异步 Asynchronous Javascript And XML(异步JavaScript和XML) Ajax 异步 JavaScript 和XML。Ajax是一种用于创建快速动态网页的技术通过在后台与服务器进行少量数据交换,Ajax可以使网…

SpringMVC01、回顾MVC

1、回顾MVC 1.1、什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。…

基本运算符

参考C Primer Plus进行C语言学习 文章目录 基本运算符 除法运算符:/其他运算 1、除法运算符 在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为截断。 2.其他运算符 (1)sizeof运算符和size_t类型 回顾一下&…

代码随想录算法训练营三刷day13 |栈与队列 之 239. 滑动窗口最大值 347.前 K 个高频元素

三刷day13 239. 滑动窗口最大值347.前 K 个高频元素 239. 滑动窗口最大值 题目链接 解题思路: 设计单调队列的时候,pop和push操作要保持如下规则: pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队…

Jumpserver堡垒机搭建

Jumpserver概述: Jumpserver优势:

DevOps学习 | 如何应对IT服务交付中的问题?

目录 前言 DevOps是什么? DevOps发展历程 DevOps与微服务、容器的关系 书本推荐 前言 作为一个热门的概念,DevOps这个名词在程序员社区里频频出现,备受技术大佬们的追捧。甚至网络上有了“南无DevOps”的戏言(南无在梵语的意…

(学习日记)2024.03.04:UCOSIII第六节:main函数+前六节总结

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

连锁线上线下门店管理为什么需要使用分账系统

连锁线上线下门店管理的复杂性要求采用有效的分账系统,以实现降低税务风险、保障资金安全和合规运营。首先,通过分账系统,可以清晰记录不同门店的收入和支出情况,有利于确保税务合规性。其次,分账系统有助于将不同门店…

Scratch 第十六课-弹珠台游戏

第十六课-弹珠台游戏 大家好,今天我们一起做一款弹珠台scratch游戏,我们也可以叫它弹球游戏!这款游戏在刚出来的时候非常火爆。小朋友们要认真学习下! 这节课的学习目标 物体碰撞如何处理转向问题。复习键盘对角色的控制方式。…

23.基于springboot + vue实现的前后端分离-在线旅游网站系统(项目 + 论文PPT)

项目介绍 本旅游网站系统采用的数据库是MYSQL ,使用 JSP 技术开发,在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 技术选型 后端: SpringBoot Mybatis 数据库 : MyS…

Django官网项目 二

官网地址:Writing your first Django app, part 2 | Django documentation | Django 创建模组: 注册model (bug:没有加后面的逗号) 在manage.py 的目录下: python manage.py makemigrations polls pyth…

打印机状态错误的解决方法

在电脑操作中,用户遇到打印机状态错误的问题,但不知道怎么操作才可以解决问题?接下来小编介绍打印机状态错误的解决方法,帮助大家轻松解决打印机出现错误状态的问题,快速恢复打印机的正常工作状态,从而满足…

固定资产管理系统建设方案

固定资产管理系统需求要点: 1. 实现公司内部固定资产管理全生命周期管理,包括资产采购、资产入库、资产领用、资产借用、资产归还、资产报废、资产维修、资产调拨等全过程管理。 2. 可实现集团内部固定资产盘点管理,包括盘点计划、盘点查询等…

多平台拼音输入法软件的开发

拼音输入法从上个世纪发展到现在, 已经发展了几十年了, 技术上已经非常成熟了. 换句话说, 就是实际上没多少技术含量, 随便来个人就能手搓一个. 本文介绍一个简单的多平台拼音输入法软件的设计和实现, 支持 GNU/Linux (ibus) 平台 (PC) 和 Android 平台 (手机). 目录 1 中文输…