学习JavaEE的日子 day15 访问修饰符,Object,equals底层,final

Day15

1.访问修饰符

理解:给类、方法、属性定义访问权限的关键字

注意:

1.修饰类只能使用public和默认的访问权限

2.修饰方法和属性可以使用所有的访问权限

经验:

1.属性一般使用private修饰,因为封装
2.属性或者方法如果需要被子类使用,一般使用protected修饰
3.方法如果不需要被外界使用,一般使用private修饰
4.方法一般使用public修饰

访问修饰符本类本包其他包子类其他包
privateOK
默认的OKOK
protectedOKOKOK
publicOKOKOKOK
public class A {
	
	public String str = "A类的属性";
	
	public void method(){
		System.out.println(str);
	}
}
public class Test01 {
	public static void main(String[] args) {
		
		A a = new A();
		System.out.println(a.str);
		
		
	}
}

2.Object类

概念:所有类的基类或者超类

理解:如果一个类没有明确继承的类,默认继承Object,所以说Object是所有类的祖先类

equals():

​ 比较两个对象的内存地址是否相同

底层代码:

public boolean equals(Object obj){
	return this == obj;
}
getClass():

​ getClass方法就是获取该类的class对象

​ 前言:
使用到类,会把该类的class文件加载到方法区,并且在堆中创建该类的class对象
该类的class对象作为class文件的访问入口
class文件只加载1次,所以该类的class对象在内存中也只有一个

hashCode():

​ 获取对象的hash值

注意:hash值不等于内存地址,hash值是对象的内存地址+散列算法,算出来的一个数值

toString():

​ 获取对象的字符串表示(将对象转换为字符串,可以看做是对象的内存地址值)

      public String toString(){

 					     //java.lang.Object          @         15db9742

 			return getClass().getName() + "@" + Integer.toHexString(hashCode());

 			//getClass().getName() - class对象的全路径(报名+类名)

 			//Integer.toHexString(hashCode()) - 获取对象的十六进制hash值

            }
==:

基本数据类型:==比较的是值是否相同

引用数据类型:==比较的是内存地址

public class Test01 {
	public static void main(String[] args) {
		
		//基本数据类型:==比较的是值是否相同
//		int a = 10;
//		int b = 20;
//		System.out.println(a == b);//false

		//引用数据类型:==比较的是内存地址
		Object obj1 = new Object();//0x001
		Object obj2 = new Object();//0x002
		System.out.println(obj1 == obj2);//false
		System.out.println(obj1.equals(obj2));//false
		
	}
}

getClass():

public class Test02 {
    public static void main(String[] args) {
		

		Object obj1 = new Object();//0x001
		Object obj2 = new Object();//0x002
		
		Class<? extends Object> class1 = obj1.getClass();//获取的是Object类的class对象
		Class<? extends Object> class2 = obj2.getClass();//获取的是Object类的class对象
		System.out.println(class1 == class2);//true
		
	}

hashcode():

public class Test03 {
   public static void main(String[] args) {
		

		Object obj1 = new Object();//0x001
		Object obj2 = new Object();//0x002
		
		System.out.println(obj1.hashCode());//366712642
		System.out.println(obj2.hashCode());//1829164700
		
	}

toString():

public class Test04 {
   public static void main(String[] args) {

		Object obj1 = new Object();//0x001
		Object obj2 = new Object();//0x002
		
		System.out.println(obj1.toString());//java.lang.Object@15db9742
		System.out.println(obj2.toString());//java.lang.Object@6d06d69c
	}     

3.Object方法的使用

getClass():在反射的知识点中使用

hashCode():在集合的知识点中使用

equals():
比较两个对象的内存地址是否相同(有==就可以)
但是他的标杆作用是比较两个对象是否相同
不同子类比较两个对象的规则不一样
所以不同子类重写equals即可

toString():
获取对象的字符串表示
他的标杆作用不同的子类有不同的属性,重写toString方便外界打印

需求:编写用户类,比较两个对象是否相同,并打印

public class User {
	
	private String username;//账号
	private String password;//密码
	private String nickName;//昵称
	private String name;//姓名
	
	public User() {
	}

	public User(String username, String password, String nickName, String name) {
		this.username = username;
		this.password = password;
		this.nickName = nickName;
		this.name = name;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getNickName() {
		return nickName;
	}

	public void setNickName(String nickName) {
		this.nickName = nickName;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
   
    // user1.equals(user2):user是子类(也就是User类),equals是object类,对象的向上转型
    //User类:默认父类是object类
    
    //user1.equals(user2)
	//this --> user1
	//obj是传进来的参数,也就是user2
    
	@Override
	public boolean equals(Object obj) { //第一步
		if(this == obj){  //比较两个内存地址是否相同
			return true;
		}
		
		User use = (User) obj;//第二步 向下转型   
		if(this.username.equals(use.username)){  //账号是一样的true,否则false
			return true;   //这个equals是String类的,比较两个字符串是否相等
		}
		return false;
	}
	
	@Override
	public String toString() {
		return this.username + " -- " + this.password + " -- " + this.nickName + " -- " + this.name;
	}
}
public class Test01 {
	public static void main(String[] args) {
		
		User user1 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x001
		User user2 = new User("1445584980", "123123", "撕裂的忧伤", "彭于晏");//0x002
		//user1,user2是否相等?从内存角度上看,new了两个对象,地址不同   从业务角度:账号一样,就一样
        
		System.out.println(user1.equals(user2));//false
		
		System.out.println(user1.toString());
		System.out.println(user2.toString());
	}
}

内存分析图:

在这里插入图片描述

扩展 - 注意:

​ 1.java方法中的参数是值传递

​ 2.如果方法中的参数是基本类型直接将实参的值传入该方法

​ 3.如果方法中的参数是引用类型将对象的内存地址作为值传入该方法

4.深入字符串String的equals()

字符串一般不用 == 比较,因为这样比较的是内存地址,肯定是false

所以字符串比较用equals()方法

面试题:String是如何比较两个字符串是否相同的

1.比较两个字符串的地址是否相同(重写equals()方法,用 == 比较)
2.比较两个字符串的字符个数(先强转)
3.循环比较字符的Unicode码

public class MyString {

	private char[] value;
	
	public MyString(String original) {
		//"abc" 转换为 ['a','b','c']
		value = original.toCharArray();//将字符串转换为字符数组
	}
	
    //重写equals方法
	@Override
	public boolean equals(Object obj) {
		if(this == obj){//比较两个内存地址是否相同
			return true;
		}
		
		MyString my = (MyString) obj;//强转为MyString
		
		char[] v1 = this.value;//当前数组
		char[] v2 = my.value;//v2
		
		//比较字符长度
		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);//将字符数组转为字符串
	}
}
public class Test01 {
	public static void main(String[] args) {
		
		String str1 = new String("abc");
		String str2 = new String("abc");
		
		System.out.println(str1 == str2);//false  一般不用
		System.out.println(str1.equals(str2));//true
		
		System.out.println(str1);//abc
		System.out.println(str2);//abc
		
		System.out.println("-------------------------------");
		
		MyString m1 = new MyString("abc");
		MyString m2 = new MyString("abc");
		
		System.out.println(m1 == m2);//false
		System.out.println(m1.equals(m2));//true
		
		//注意:打印对象,默认调用toString()
		System.out.println(m1);//不重写toString(),就打印地址值
		System.out.println(m2);//不重写toString(),就打印地址值
	}
}

小结:

​ 1.默认情况下equals方法比较的是对象的地址值

​ 2.比较对象的地址值是没有意义的,因此一般情况下我们都会重写Object类中的equals方法

5.final

作用:

1.final修饰类,该类不能被继承

2.final修饰方法,该方法不能被子类重写

3.final修饰变量,变量变为常量,不能重新赋值

注意:

1.常量在常量池中声明,项目结束时才会被销毁

2.常量的命名规范:全部单词大写,单词之间使用下划线隔开

经验:

如果不想让该类有子类(不想该类有扩展),就是用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
toString

3.Object的使用
子类重写equals和toString

4.MyString – 重要!!!

5.final - 最终的
修饰类,类不能被继承
修饰方法,方法不能被重写
修饰变量,变为常量

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

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

相关文章

珠三角佛山哪里有抄数的公司汽车3d尺寸检测逆向建模三维扫描服务

在当今的汽车行业中&#xff0c;随着技术的不断进步&#xff0c;对汽车配件的精度和质量要求也越来越高。传统的测量和设计方法已经无法满足现代工业生产的需要。因此&#xff0c;汽车配件三维扫描及建模设计技术的出现&#xff0c;为汽车制造业带来了革命性的变革。 汽车配件三…

C++ Linux动态库的编译和调用

一、C动态库编译 采用g编译C动态库&#xff0c;命令如下&#xff1a; g -fPIC -shared -o 动态库名 cpp文件名1.1 关于fPIC选项 首先了解动态库的载入时重定位。 一般linux的可执行文件都是elf格式&#xff08;一种二进制文件格式&#xff09;&#xff0c;在可执行文件的头部包…

在线App封装技术:HTML5的新生命

HTML5封装的魅力所在HTML5带来了丰富的多媒体功能、地理位置服务、离线存储等特性&#xff0c;使得Web应用的体验更加接近原生App。封装HTML5到App中&#xff0c;可以大大缩短开发周期&#xff0c;降低开发成本&#xff0c;并且一次编写&#xff0c;多平台运行&#xff0c;极大…

ant-desgin的table的上移、下移

文章目录 html部分函数部分 html部分 <a-table :columns"columns" :data-source"dataList" :loading"listLoading" :pagination"false"><template #bodyCell"{ column, record, index }"><template v-if&qu…

Xline v0.6.1: 一个用于元数据管理的分布式KV存储

Xline是什么&#xff1f;我们为什么要做Xline&#xff1f; Xline是一个基于Curp协议的&#xff0c;用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议&#xff0c;需要两次RTT才能完成一次请求。当部署在单个数据中心时&#xff0c;节点之间的延迟较低&a…

2024Java高频面试题之MQ消息中间件,面试都问些什么?(附详细答案)

最近很多同学问我有没有java学习资料&#xff0c;我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号&#xff1a;“ Tom聊架构 ”&#xff0c; 回复暗号&#xff1a;“ 578”即…

(人才测评)招聘数据分析师的入职测评方案

现在是一个大数据的时代&#xff0c;我们的车载导航、淘宝购物、包括人才招聘、都是大数据的产物&#xff0c;然而光靠数据堆积是没用的&#xff0c;所以如何高效的进行数据挖掘与分析&#xff0c;就成了每一件企业思考的问题。 一、 数据分析师的基本工作标准 1、 平时需要…

信息化和数字化的本质区别是什么?

信息化和数字化的本质区别是什么&#xff1f; 谢邀。前两年流行”信息化“&#xff0c;网上铺天盖地都是关于”信息化“的文章&#xff0c;这两年开始流行起“数字化”&#xff0c;于是铺天盖地都是“数字化”的文章&#xff0c;从数字化和信息化这两个关键词热度趋势就可以看…

qemu安装踩坑记(源码编译make版

qemu安装踩坑记&#xff08;源码编译make版 【写在前面】 本篇文章写于6.27号&#xff0c;发现写完但没发博客2333 大家好这里是β-AS&#xff0c;或者也可以喊我贝塔&#xff0c;或许也可也喊我be7a 没有人会永远学qemu&#xff0c;但永远会有人踩坑.jpg 依旧推荐一首歌 -1…

如何使用JS逆向爬取网站数据

引言&#xff1a; JS逆向是指利用编程技术对网站上的JavaScript代码进行逆向分析&#xff0c;从而实现对网站数据的抓取和分析。这种技术在网络数据采集和分析中具有重要的应用价值&#xff0c;能够帮助程序员获取网站上的有用信息&#xff0c;并进行进一步的处理和分析。 基…

Pytest插件pytest-django让Django测试更高效

在Django应用开发中&#xff0c;测试是确保应用质量的关键环节。然而&#xff0c;Django自带的测试框架并非总能满足开发者的需求&#xff0c;而Pytest插件 pytest-django 则为我们提供了更为灵活、强大的测试工具。本文将深入介绍 pytest-django 插件的基本用法和实际案例&…

ChatGPT给出的前端面试考点(html+css+JS)

ChatGPT给出的前端面试考点&#xff08;htmlcssJS&#xff09; HTML HTML是什么&#xff0c;它的主要作用是什么&#xff1f; 什么是DOCTYPE&#xff0c;为什么在HTML文档中使用它&#xff1f; HTML5相对于之前的HTML版本有哪些主要的新特性&#xff1f; 解释语义化HTML的概…

google网站流量怎么获取?

流量是一个综合性的指标&#xff0c;可以说做网站就是为了相关流量&#xff0c;一个网站流量都没有&#xff0c;那其实就跟摆饰品没什么区别 而想从谷歌这个搜索引擎里获取流量&#xff0c;一般都分为两种方式&#xff0c;一种是网站seo&#xff0c;另一种自然就是投广告&#…

智能反射面—流形优化

使用Manopt工具箱适合优化最小化问题&#xff0c;如果你的优化问题是最大化问题&#xff0c;那么需要将其转换为最小化问题然后使用Manopt工具箱求解。 具体安装过程 Matlab添加Manopt - 知乎 (zhihu.com) 优化问题 clc,clear; close all; srng(1);%rand seed N10; GR_num1e3…

一套可以替代人工的Cnc机床自动上下料机器人

Cnc机床自动上下料|整体解决方案 CNC机床自动上下料是指通过自动化设备和系统&#xff0c;实现CNC机床在加工过程中自动进行上下料操作。这种自动化系统通常包括自动送料机和卸料机&#xff0c;可以根据加工工件的尺寸和形状自动调整上下料的位置和角度&#xff0c;从而提高生产…

Spring Boot 优雅实现统一数据返回格式+统一异常处理+统一日志处理

在我们的项目开发中&#xff0c;我们都会对数据返回格式进行统一的处理&#xff0c;这样可以方便前端人员取数据&#xff0c;当然除了正常流程的数据返回格式需要统一以外&#xff0c;我们也需要对异常的情况进行统一的处理&#xff0c;以及项目必备的日志。 1. 统一返回格式 …

Unity 编辑器篇|(九)编辑器美化类( GUIStyle、GUISkin、EditorStyles) (全面总结 | 建议收藏)

目录 1. GUIStyle1.1 参数总览1.2 样式代码 2. GUISkin2.1 参数总览2.2 创建自定义Skin 3. EditorStyles2.1 参数总览1.2 反射获取所有EditorStyles 1. GUIStyle GUIStyle是一个用于定制GUI控件样式的类&#xff0c;它包含了控件的外观属性&#xff0c;如字体、颜色、背景等。…

visual studio的安装及scanf报错的解决

visual studio是一款很不错的c语言编译器 下载地址&#xff1a;官网 点击后跳转到以下界面 下滑后点击下载Vasual Sutdio&#xff0c;选择社区版即可 选择位置存放下载文件后&#xff0c;即可开始安装 安装时会稍微等一小会儿。然后会弹出这个窗口&#xff0c;我们选择安装位…

OpenGL DIR

Mesa简介-CSDN博客 Mesa, also called Mesa3D and The Mesa 3D Graphics Library, is an open source software implementation of OpenGL, Vulkan, and other graphics API specifications. Mesa translates these specifications to vendor-specific graphics ha…

网络安全 | 苹果承认 GPU 安全漏洞存在,iPhone 12、M2 MacBook Air 等受影响

1 月 17 日消息&#xff0c;苹果公司确认了近期出现的有关 Apple GPU 存在安全漏洞的报告&#xff0c;并承认 iPhone 12 和 M2 MacBook Air 受影响。 该漏洞可能使攻击者窃取由芯片处理的数据&#xff0c;包括与 ChatGPT 的对话内容等隐私信息。 安全研究人员发现&#xff0c;…
最新文章