由浅到深认识Java语言(18):权限修饰符包Object类

该文章Github地址:https://github.com/AntonyCheng/java-notes

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(17):内部类

28.权限修饰符

权限修饰符 { p u b l i c d e f a u l t p r o t e c t e d p r i v a t e \bf{权限修饰符}\begin{cases}\bf{public}\\\bf{default}\\\bf{protected}\\\bf{private}\end{cases} 权限修饰符 publicdefaultprotectedprivate

public 公共权限

在任何地方都能够使用,可以修饰类,也可以修饰属性,还可以修饰方法和构造器;

这里的任何地方指的是不同包之间都可以调用的元素;

示例如下:

packageOne:

A 类:

package top.sharehome.Bag1;public class A {public String str = "A.str" ;
}

B 类:

package top.sharehome.Bag1;public class B {public void method() {System.out.println("B.method()");}
}

packageTwo:

Demo 类:

package top.sharehome.Bag2;import top.sharehome.Bag1.A;
import top.sharehome.Bag1.B;public class Demo {public static void main(String[] args) {A a = new A();B b = new B();System.out.println(a.str);b.method();}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

default 默认权限(不加修饰符)

也称 package 权限 (包级权限) ,可以修饰类,也可以修饰属性,还可以修饰方法,但不能修饰构造器;

权限要求是只在本包内进行调用的元素,不可在不同包之间互相调用;

示例如下:

packageOne:

A 类:

package top.sharehome.Bag1;class A {String str = "A.str";
}

B 类:

package top.sharehome.Bag1;class B {void method() {System.out.println("B.method()");}
}

packageTwo:

Demo 类:

package top.sharehome.Bag2;
import top.sharehome.Bag1.A;   //因为调用不到,所以这里会报错
import top.sharehome.Bag1.B;   //也是因为调用不到,所以这里也会报错public class Demo {public static void main(String[] args) {A a = new A();B b = new B();System.out.println(a.str);b.method();}
}

protected 受保护权限

该权限大都应用在非本包的项目内;

在本包下,相当于 default;

在非本包下:对于非子孙类相当于 private;对于子孙类相当于 public;

protected 可以修饰属性,方法和构造器;

private 私有权限

private 只能修饰属性,方法和构造器;

private 只能在本类中进行访问和调用;

29.Java中的包

定义:包就是对类实现统一管理的容器,一个类的完整类名应该是 包名+类名

注意:类的首行需要说明该类所在的包;

//package 包名;
package top.sharehome.Bag;

类的导入:

//import 包名.类名;  //包内单个类
//import 包名.*;    //包内所有的类
//例如下:
import top.sharehome.Bag.A;
import top.sharehome.Bag.*;

如果只想创建一次某一个包内某一类的对象:

//包名.类名 对象名 = new 包名.类名();
//例如下:
top.sharehome.Bag.A a = new top.sharehome.Bag.A();

30.Object类

所有类的父类,都是 Object,意味着 Object 类中所有的结构,每个类都会拥有;

Object类中的结构

JDK:java 的开发工具集中包含了一个 lib 文件(类库),该文件中存放着 java 出版商已经设计好的各种类,这些类供我们使用;

lib 文件位置:\Java\lib

Object 类中的方法:

返回类型方法解释
protected Objectclone() 创建并返回此对象的一个副本。
booleanequals(Object obj) 指示其他某个对象是否与此对象“相等”。
protected voidfinalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
Class<?>getClass() 返回此 Object 的运行时类。
inthashCode() 返回该对象的哈希码值。
voidnotify() 唤醒在此对象监视器上等待的单个线程。
voidnotifyAll() 唤醒在此对象监视器上等待的所有线程。
StringtoString() 返回该对象的字符串表示。
voidwait() 在其他线程调用此对象的 notify()方法或 notifyAll()方法前,导致当前线程等待。
voidwait(long timeout) 在其他线程调用此对象的 notify()方法或 notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。
voidwait(long timeout, int nanos) 在其他线程调用此对象的 notify()方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。

toString()方法

**作用:**返回该对象的字符串表示,返回值是 String

实例如下:

package top.sharehome.Package;
public class Demo {public static void main(String[] args) {Student Stu = new Student();Stu.setName("小陈");Stu.setAge(18);System.out.println(Stu.toString());   //这里运用的是toString方法}
}class Student {private String name;private int age;public Student() {super();// TODO Auto-generated constructor stub}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

当直接打印一个对象时,看到的是一个哈希码值(hashCode);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即上图中的 372f7a8d,也就是说 System.out.println(对象) 会直接调用对象所继承的 toString() 方法;

Object 类中的 toString() 方法如下:

public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

所以就能解释打印结果了;

Q : Q: Q: 但是我们希望我们打印的方法是对象里每一个具体的值?

A : A: A: 因为是从 Object 类中继承过来的,所以我们可以通过方法的重写来实现;

package top.sharehome.Package;
public class Demo {public static void main(String[] args) {Student Stu = new Student();Stu.setName("小陈");Stu.setAge(18);System.out.println(Stu.toString());}
}class Student {private String name;private int age;public Student() {super();// TODO Auto-generated constructor stub}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//toString方法的重写public String toString() {String message = "姓名:"+this.name + "    "+"年龄:"+this.age; return message;}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意: eclipse 有直接重写 toString 的快捷方式 ==> Ctrl+Shift+S ==> Generate toString()

equals(Object obj)方法

**作用:**每个对象都会有一个 equals() 方法,用于比较当前对象是否和参数传进来的对象相等,返回值是 boolean

Object 类中的 equals(Object obj) 方法如下:

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

比较运算符 ”==“ 的两种结果:

  1. 对于基本数据类型来说,”==“ 比较的是基本数据类型的值是否相等;

  2. 对于引用数据类型来说,”==“ 比较的是引用数据类型的地址值是否相等;

    对于任何两个对象来说,地址值必然不同,例如下:

    package top.sharehome.Bag;public class Demo {public static void main(String[] args) {Student s1 = new Student("小陈", 20);Student s2 = new Student("小陈", 20);Boolean result1 = s1.equals(s2); //不同对象Boolean result2 = s1.equals(s1); //相同对象System.out.println(result1);System.out.println(result2);}
    }class Student {private String name;private int age;public Student(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    Q : Q: Q: 但是我们希望比较两个对象完全相同的依据是对象的属性是否完全相同?

    A : A: A: 所以我们得对 equals(Object obj) 方法重写;

equals(Object obj) 方法重写:

原理:

当前对象是 this ,比较对象是 obj;

比较两个对象的 name 和 age 属性是否完全相同,相同则 false ,否则 true;

就如上例:

package top.sharehome.Bag;public class Demo {public static void main(String[] args) {Student s1 = new Student("小陈", 20);Student s2 = new Student("小花", 20);Boolean result1 = s1.equals(s2);Boolean result2 = s1.equals(s1);System.out.println(result1);System.out.println(result2);}
}class Student {private String name;private int age;public Student(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {  //这里运用多态:Object obj = new Student(String name,int age);//这里发现父类中没有 name 和 age,但是子类 Student类中有,所以要向下转型:instanceof + 强行转换if (obj instanceof Student) {Student Stu = (Student) obj;//判断age是否相同if(this.age == Stu.age) {//判断name是否相同:因为String类型是引用数据类型,所以不能用"=="简单比较;//但是用"=="比较也会有相同结果,但是对于引用数据的对比需规范 equalsif(this.name.equals(Stu.name)) {return true;}else {return false;}}else {return false;}}return false;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**注意:**eclipse 有直接重写 equals 的快捷方式 ==> Ctrl+Shift+S ==> Generate hashCode() and equals()

如下例就是完全依靠 eclipse 写出的 Student 类:

package top.sharehome.Bag;import java.util.Objects;public class Demo {public static void main(String[] args) {Student Stu1 = new Student("小陈",20,"女");Student Stu2 = new Student("小陈",20,"女");Student Stu3 = new Student("小伍",20,"男");System.out.println(Stu1.equals(Stu2));System.out.println(Stu1.equals(Stu3));}
}class Student {private String name;private int age;private String sex;public Student() {super();// TODO Auto-generated constructor stub}public Student(String name, int age, String sex) {super();this.name = name;this.age = age;this.sex = sex;}@Overridepublic int hashCode() {return Objects.hash(age, name, sex);}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;return age == other.age && Objects.equals(name, other.name) && Objects.equals(sex, other.sex);}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

hashCode()方法(详情在集合)

该方法能够产生一个对象的哈希码值,哈希码值决定了该对象在内存的存放位置;

Object 类中的 hashCode() 方法如下:

@IntrinsicCandidate
public native int hashCode();

下一章:由浅到深认识Java语言(19):String类

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

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

相关文章

学习网络编程No.15【高级IO之多路转接】

引言&#xff1a; 北京时间&#xff1a;2024/3/19/11:16&#xff0c;若是说记忆有克星的话&#xff0c;那么一定是时间。若是说耐心有克星的话&#xff0c;那么一定是人的心态。连续几天睡眠问题&#xff0c;加上环境影响&#xff0c;上篇博客还有部分知识只能放在该篇博客介绍…

scFEA安装

scFEA: A graph neural network model to estimate cell-wise metabolic using single cell RNA-seq data github链接GitHub - changwn/scFEA: single cell Flux Estimation Analysis (scFEA) Try the below web server! Package Tutorial seurat对象使用scFEAscFEA/scFEA_t…

第 K 小/大 题目总结(持续更新...)

2386.找出数组的第 K 大和 此题为找数组任意子序列第k小和模板 1508. 子数组和排序后的区间和 此题为找数组连续子序列第k小和模板

git cherry pick merge部分提交

cherry pick merge 指定某次提交 1. git history 选择要从哪个分支merge 2. 找到提交记录,选择cherry pick 3.这个时候就可以直接push了

vba单元格

Sub 修改单元格() Dim r1 As Range 定义一个range类型的变量 Set r1 Range(Cells(1, 2), Cells(1, 5)) 1行2列到1行5列 x cells(3,1) 得到指定行列的值 Dim r As Range 定义一个range类型的变量 Set r Range("a1:a4") a1单元格到a4单元格 r.Interior.Color …

tesseract OCR引擎怎样安装?

要安装Tesseract OCR引擎&#xff0c;可以按照以下步骤进行操作&#xff1a; 在计算机上安装Tesseract OCR的依赖项。这些依赖项包括Tesseract库、Leptonica图像处理库和语言数据文件。可以使用包管理器&#xff08;如apt-get、brew或choco&#xff09;来安装这些依赖项。 下载…

代码随想录Day20:二叉树Part6

Leetcode 654. 最大二叉树 讲解前&#xff1a; 这道题其实思路并不难&#xff0c;无非就是找到当前数组的最大值作为root节点&#xff0c;然后对数组进行切割之后再对左右两个数组进行递归重复操作 class Solution:def constructMaximumBinaryTree(self, nums: List[int]) -…

C语言获取输出相关函数scanf、gets、fgets等

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 二、 2.1 fgets 2024年3月26日19:31:46 今天写了个牛客的题目&#xff0c;坐标移动 坐标移动代码链接 里面我用gets&#xff0c;但是提示warni…

【统计】什么事 R 方

将线性模型拟合到时间序列时&#xff0c;通常使用最小二乘法在模型 y ^ ( t ) a b t \hat{y}(t) a bt y^​(t)abt中找到系数 a a a和 b b b&#xff0c;其中 y ^ ( t ) \hat{y}(t) y^​(t)是时间 t t t的预测值&#xff0c;而的观测值是 y ( t ) y(t) y(t)。 残差平方和又…

LeetCode第二天(628. 三个数的最大乘积)

给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 我的答案&#xff1a;&#xff08;只通过了63个用例&#xff0c;没考虑到两个负数相乘得正的情况&#xff09; class Solution {public int maximumProduct(int[] nums) …

ResultMap 映射

过在 MyBatis 的映射文件中使用 <result> 标签进行映射后&#xff0c;SQL 查询语句就可以使用 Java 实体类中的属性名来编写。当你在 ResultMap 中使用 <result> 标签将数据库表的字段名和 Java 实体类的属性名进行映射后&#xff0c;MyBatis 在执行 SQL 查询时会自…

【自我提升】计算机领域相关证书

目录 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09;Oracle认证Cisco认证微软认证红帽认证AWS认证 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09; 计算机技术与软件专业技术资格&a…

掌握Yarn:一步步安装、配置及应用全解析!

深入理解Yarn&#xff1a;安装、配置与实战应用 引言一、 Yarn简介二、 Yarn的安装三、 Yarn的基本使用四、 Yarn的高级功能五、 Yarn与持续集成/持续部署&#xff08;CI/CD&#xff09;六、 Yarn的定制化与扩展七、 社区和生态系统 引言 大家好&#xff0c;这里是程序猿代码之…

【数仓】DataX软件安装及配置,从mysql同步到hdfs

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…

C++中的内存分区

栈&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中&#xff0c;效率很高&#xff0c;但是分配的内存容量有限 堆&#xff1a;就是那些由 new分配的内…

Prometheus(六):Blackbox监控安装配置

目录 1 Blackbox Exporter安装配置1.1 Blackbox Exporter简介1.2 安装1、安装-使用源码包安装下载安装blackbox.yml文件配置快速启动文件 2、安装-使用docker 1.3 Prometheus配置1、http监控2、ping探测-ip3、https probe-DNS解析4、metrics配置5、TCP监控-探测端口 总结 1 Bla…

2022全球AI生物智药大赛赛道二参赛攻略@paipai

大家好&#xff0c;我是来自paipai队的徐一帆&#xff0c;Github ID IvanaXu [01]&#xff0c;相关研究工作都会开源在上面&#xff0c;欢迎大家关注&#xff01; 以下是关于本次“云上进化”2022全球AI生物智药大赛 [02]&#xff1a;赛道二“抗原抗体结合Epitope和Paratope精…

8.2024

我们知道第一个质数是2&#xff0c;第二个质数是3&#xff0c;第三个质数是5.... 请你计算第2023个质数? 代码&#xff1a; import java.util.ArrayList;public class 第八题 {public static void main(String[] args) {ArrayList<Object> list new ArrayList<>…

鸿蒙OS实战:【module的使用】

在开发HarmonyOS应用时&#xff0c;默认创建的工程会有一个entry module&#xff0c;实际应用场景为了代码或者功能解耦&#xff0c;我们需要用到module来进行隔离。根据鸿蒙3.0/3.1/4.0官方指导&#xff0c;我们可以了解到关于module的类型&#xff0c;以及依赖关系&#xff0…

代码随想录学习Day 18

530.二叉搜索树的最小绝对差 题目链接 讲解链接 思路&#xff1a;利用二叉搜索树的性质&#xff0c;其中序遍历序列是一个有序数组。所以先对二叉搜索树进行中序遍历&#xff0c;得到一个递增的数组后&#xff0c;再遍历整个数组&#xff0c;依次求相邻值的差&#xff0c;最…