访问修饰符、Object(方法,使用、equals)、查看equals底层、final--学习JavaEE的day15
day15
一、访问修饰符
含义:
修饰类、方法、属性,定义使用的范围
理解:给类、方法、属性定义访问权限的关键字
注意:
1.修饰类只能使用public和默认的访问权限
2.修饰方法和属性可以使用所有的访问权限
| 访问修饰符 | 本类 | 本包 | 其他包子类 | 其他包 |
|---|---|---|---|---|
| private | OK | |||
| 默认的 | OK | OK | ||
| protected | OK | OK | OK | |
| public | Ok | OK | OK | Ok |
做实验
两个包下分别父类和子类,测试类进行实验
经验:
1.属性一般使用private修饰,因为封装
2.属性或者方法如果需要被子类使用,一般使用protected修饰
3.方法如果不需要被外界使用,一般使用private修饰
4.方法一般使用public修饰
二、Object
概念:
所有类的基类或者超类
理解:如果一个类没有明确继承的类,默认继承Object,所以说Object是所有类的祖先类
方法
equals:
作用:比较两个对象内存地址是否相同
public boolean equals(Object obj){return this == obj;}
注意:equals和==
a.基本数据类型:==比较的是值是否相同
b.引用数据类型:==比较的是内存地址
查看equals底层
鼠标放在equals上按ctrl点击----->点击Attach Source------>选择外部路径External location----->ps:C:\Program Files\Java\jdk1.8.0_144\src.zip
equals内存图
扩展
1.Java方法的参数是值传递
2.如果方法中参数是基本类型直接将实参的值传入该方法 3.如果方法中的参数是引用类型将对象的内存地址作为值传入该广法
hashCode:
作用:获取对象的hash值
hash值不等于内存地址,hash值是对象的内存地址+散列算法,算出来的一个数值
System.out.println(obj1.hashCode());//366712642
getClass:
作用:获取类的字节码文件对象
注意:
使用到类,会把该类的class文件加载到方法区,并且在堆中创建该类的class对象
该类的class对象作为class文件的访问入口
class文件只加载1次,所以该类的class对象在内存中也只有一个
Object obj1 = new Object();//0x001Object obj2 = new Object();//0x002Class<? extends Object> class1 = obj1.getClass();//获取的是Object类的class对象Class<? extends Object> class2 = obj2.getClass();//获取的是Object类的class对象System.out.println(class1 == class2);//true
toString:
作用:获取对象的字符串表示(将对象转换为字符串)
toString底层:
public String toString(){
//java.lang.Object @ 15db9742
return getClass().getName() + “@” + Integer.toHexString(hashCode());//getClass().getName() - class对象的全路径(报名+类名)//Integer.toHexString(hashCode()) - 获取对象的十六进制hash值}
Object obj1 = new Object();//0x001Object obj2 = new Object();//0x002System.out.println(obj1.toString());//java.lang.Object@15db9742System.out.println(obj2.toString());//java.lang.Object@6d06d69c
方法的使用
Object方法标杆作用
Object方法标杆作用:Object作为所有类的父类,定义了几个方法,方便子类去重写
equals:比较两个对象是否相同,不同子类比较两个对象的规则不一样,所以子类重写即可
toString:每个子类都有不同的属性,重写toString直接打印该对象中所有的属性,方便观察数据
getClass():在反射的知识点中使用
hashCode():在集合的知识点中使用
equals和toString使用
需求:编写用户类,比较两个对象是否相同,并打印
封装User(默认继承Object),重写equals、toString
@Overridepublic boolean equals(Object obj) {if(this == obj){//比较两个对象的内存地址是否一致return true;}//两个对象的内存地址不一致User use = (User) obj;//需要强转,java的参数是值传递//当前对象的账号和传进来对象的账号,此处是String类型的equals()if(this.username.equals(use.username)){return true;}return false;}@Overridepublic String toString() {//打印所有属性return this.username + " -- " + this.password + " -- " + this.nickName + " -- " + this.name;}//测试类User user1 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x001User user2 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x002System.out.println(user1.equals(user2));System.out.println(user1.toString());System.out.println(user2.toString());
深入String的equals()
MyString
重写方法(@Override),String的equals底层原理
首先toCharArray()将字符串转换为字符数组
重写equals
a.比较内存地址是否相同
b.比较字符长度是否相同
c.比较字符的Unicode码是否相同
重写toString
valueOf()将字符数组转为字符串
注意:打印对象,默认调用toString()
public class MyString {private char[] value;public MyString(String original) {//"abc"//['a','b','c']value = original.toCharArray();//将字符串转换为字符数组
}@Override
public boolean equals(Object obj) {if(this == obj){return true;}MyString my = (MyString) obj;char[] v1 = this.value;char[] v2 = my.value;//比较字符长度if(v1.length != v2.length){return false;}for (int i = 0; i < v1.length; i++) {//比较字符的Unicode码是否相同if(v1[i] != v2[i]){return false;}}return true;
}@Override
public String toString() {return String.valueOf(value);//将字符数组转为字符串
}}
2.面试题:String是如何比较两个字符串是否相同的
1.比较两个字符串的地址是否相同
2.比较两个字符串的字符个数
3.循环比较字符的Unicode码
//String和MyString都可以实现,表明重写的MyString符合要求
String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1 == str2);//falseSystem.out.println(str1.equals(str2));//trueSystem.out.println(str1);System.out.println(str2);System.out.println("-------------------------------");MyString m1 = new MyString("abc");MyString m2 = new MyString("abc");System.out.println(m1 == m2);//falseSystem.out.println(m1.equals(m2));//true//注意:打印对象,默认调用toString()System.out.println(m1);System.out.println(m2);
三、final
含义:
最终的
关键字
作用:
- 修饰类:该类不能被继承
- 修饰方法:该方法不能被重写
- 修饰变量:变成常量,不能重新赋值
注意:
1.常量在常量池中声明,项目结束时才会被销毁
2.常量的命名规范:全部单词大写,单词之间使用下划线隔开
3.常量的生命周期:存在常量池中,直到项目结束才会被销毁
经验:
如果不想让该类有子类(不想该类有扩展),就是用final修饰final和static一般一起修饰属性,该属性变成静态常量
做实验
//final修饰类,该类不能被继承
//public final class A {
public class A {//final修饰方法,该方法不能被子类重写
//public final void method(){
public void method(){System.out.println("父类的方法");
}}
public class B extends A{@Override
public void method() {System.out.println("子类重写父类的方法");//final修饰变量,变量变为常量,不能重新赋值final int i = 100;System.out.println(i);
}}
总结
1.访问修饰符 – 一定要去做实验
2.Object的概念
equals
getClass
hashCode
toString3.Object的使用
子类重写equals和toString4.MyString – 重要!!!
5.final - 最终的
修饰类,类不能被继承
修饰方法,方法不能被重写
修饰变量,变为常量
相关文章:
访问修饰符、Object(方法,使用、equals)、查看equals底层、final--学习JavaEE的day15
day15 一、访问修饰符 含义: 修饰类、方法、属性,定义使用的范围 理解:给类、方法、属性定义访问权限的关键字 注意: 1.修饰类只能使用public和默认的访问权限 2.修饰方法和属性可以使用所有的访问权限 访问修饰符本类本包…...
『大模型笔记』最大化大语言模型(LLM)的性能(来自OpenAI DevDay 会议)
最大化大语言模型(LLM)的性能(来自OpenAI DevDay 会议) 文章目录 一. 内容介绍1.1. 优化的两个方向(上下文优化和LLM优化)1.2. 提示工程:从哪里开始1.3. 检索增强生成:拓展知识边界1.4. 微调:专属定制二. 参考文献一. 内容介绍 简述如何以可扩展的方式把大语言模型(LLMs)…...
深度学习:开启你的AI探索之旅
在这个信息爆炸的时代,人工智能(AI)已经渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,从智能推荐系统到医疗影像诊断,AI的身影无处不在。而深度学习,作为AI领域的一大核心技术,更是引领着这场科技革命的浪潮。那么,如何入门深度学习,踏上这趟充满挑战与机…...
第十四届蓝桥杯大赛B组 JAVA 蜗牛 (递归剪枝)
题目描述: 这天,一只蜗牛来到了二维坐标系的原点。 在 x 轴上长有 n 根竹竿。它们平行于 y 轴,底部纵坐标为 0,横坐标分别为 x1, x2, …, xn。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第 n 个竹竿的底部也…...
基于React低代码平台开发:构建高效、灵活的应用新范式
文章目录 一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践:基于React》编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书 随着数字化转型的深入&…...
在Linux部署Docker并上传静态资源(快速教程)
Nginx快速上手 安装必要的软件包 yum install -y yum-utils device-mapper-persistent-data lvm2设置Docker仓库 通过以下命令添加Docker的官方仓库到yum源中: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装Dock…...
【场景测试用例】带有广告图案的纸杯
从以下几个纬度出发考虑: 功能 是否可以承载液体,热水,温水,冰水是否可以承载非液体类的物品容量,空杯,半杯,满杯 UI 广告图案设计是否合理 性能 最大承受的容量内不漏水(负载测试)最大承受的温…...
《TCP/IP详解 卷一》第10章 UDP 和 IP 分片
目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子:IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…...
MyBatisPlus(SpringBoot版)的分页插件
目录 一、前置工作: 1.整体项目目录结构 2.创建普通javamaven项目。 3.导入依赖,改造成springboot项目 4.配置启动类 5.创建service接口及其实现类 6.创建接口Mapper 7.配置数据源 8.创建数据库表 二、使用MP(mybatisplus)的分页插件 二、使…...
【小沐学QT】QT学习之信号槽使用
文章目录 1、简介2、代码实现2.1 界面菜单“转到槽”方法2.2 界面信号槽编辑器方法2.3 QT4.0的绑定方法2.4 QT5.0之后的绑定方法2.5 C11的方法2.6 lamda表达式方法2.7 QSignalMapper方法 结语 1、简介 在GUI编程中,当我们更改一个小部件时,我们通常希望…...
SpringMVC总结
SpringMVC SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介 请求与响应 REST风格 SSM整合(注解版) 拦截器 SpringMVC是处理Web层/表现层的框架ÿ…...
JS一些重要函数
防抖函数 避免短时间内的函数多次调用影响性能 function debounce(func , wait){let timer;return (...args) > {clearTimeout(timer);timer setTimeout(() > {return func(args)} , wait)} } 函数柯里化 将多参函数以单参的形式传递 function curry(fn){return func…...
基于视觉识别的自动采摘机器人设计与实现
一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的进步和农业现代化的发展,农业生产效率与质量的提升成为重要的研究对象。其中,果蔬采摘环节在很大程度上影响着整个产业链的效益。传统的手工采摘方式不仅劳动强度大、效率低下,而且在劳…...
算法D32 | 贪心算法2 | 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II
122.买卖股票的最佳时机II 本题解法很巧妙,大家可以看题思考一下,在看题解。 代码随想录P 只收集每天的正利润,利润可以每天分解。 Python: class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices)<2: retur…...
【iOS ARKit】协作 Session 实例
协作 Session 使用注意事项 协作 Session 是在 ARWorldMap 基础上发展起来的技术,ARWorldMap 包含了一系列的地标、ARAnchor 及在观察这些地标和 ARAnchor 时摄像机的视场(View)。如果用户在某一个位置新创建了一个 ARAnchor,这时…...
云原生精品资料合集(附下载)
云计算是产业数字化转型的关键基础设施,以基础设施资源为中心的云搬迁时代接近尾声,以应用价值为中心的云原生时代已经到,所以IT人员学习云原生正当时!最近跟各位大神征集了云原生的教程,行业报告和最佳实践,总有一款适…...
JVM 第一部分 JVM两种解释器 类加载过程和类加载器
JVM是跨平台跨语言的虚拟机,不直接接触硬件,位于操作系统的上一层 跟字节码文件直接关联,和语言没有关系 一次编译成字节码文件,多次执行 虚拟机可以分成三部分:类加载器,运行时数据区,执行引…...
用Java语言创建的Spring Boot项目中,如何传递数组呢??
问题: 用Java语言创建的Spring Boot项目中,如何传递数组呢?? 在这个思路中,其实,Java作为一个后端开发的语言,没必要着重于如何传入,我们主要做的便是对传入的数组数据进行处理即可…...
[笔记] 使用 Java Swing 实现一个简单的窗口
Java Swing 是一个用于构建图形用户界面(GUI)的Java库,它提供了丰富的组件和工具,用于创建交互式的桌面应用程序。Swing 是 Java Foundation Classes(JFC)的一部分,它是 Java 平台的一种标准用户…...
2024.03.03蓝桥云课笔记——排序
sort简介 #include<algorithm> 使用的是快速排序 时间复杂度为O(nlogn) sort使用(默认是从小到大) 1.sort(起始地址,结束地址的下一位,*比较函数); #include<iostream> #include<algorithm> using namesp…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
