由浅到深认识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;上篇博客还有部分知识只能放在该篇博客介绍…

git cherry pick merge部分提交

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

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

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

【数仓】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;最…

漏洞扫描-让安全弱点无所遁形

随着信息技术的迅猛发展和互联网的广泛普及&#xff0c;网络安全问题日益凸显。在这个数字化的世界里&#xff0c;无论是企业还是个人&#xff0c;都面临着前所未有的安全威胁。安全漏洞&#xff0c;作为这些威胁的源头&#xff0c;常常被忽视或无法及时发现。 而漏洞扫描&…

静态住宅IP优缺点,究竟要怎么选?

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

经验篇04-为什么学了很多知识/读了很多书却没用

前言 以下内容是参加古典老师的写作训练营&#xff0c;古典老师分享的视频课程&#xff0c;对于喜欢阅读或者学习的人来说&#xff0c;可以揭开【学了很多东西却没用】这个问题的神秘面纱&#xff0c;我个人收获非常大&#xff0c;结合了一些自己的理解&#xff0c;形成此文&am…

java常用IO流功能——字符流和缓冲流概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup! 之前说了下了IO流的概念&#xff0c;并整理了字节流&#xff0c;有需要的可以看这篇 java常用应用程序编程接口&#xff08;API&#xff09;——IO流概述及字节流的使用 字符流 FileReader(文件字…

代码随想录算法训练营Day35|LC860 柠檬水找零LC406 根据身高重建队列LC452 用最少数量的箭引爆气球

一句话总结&#xff1a;身高队列看起来不简单&#xff0c;实际上也很难。 原题链接&#xff1a;860 柠檬水找零 简单贪心思想即可。5元时加入cnt5&#xff0c;10元时cnt10&#xff0c;cnt5--&#xff0c; 20元时则优先找零10元再找零5元&#xff0c;这样最后判断是否在一次找零…

超全整理,软件测试-性能测试流程汇总,看这一篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试&#xf…

2024年蓝牙耳机怎么选?五大爆火真无线蓝牙耳机推荐大公开!

​随着科技的进步&#xff0c;越来越多的用户倾向选择无线蓝牙耳机&#xff0c;摆脱有线耳机的束缚&#xff0c;享受更加自由的音乐体验。为了帮助大家选购到适合自己的蓝牙耳机&#xff0c;我整理了一些目前市面上我个人认为性能优异的款式&#xff0c;与大家分享。 一、蓝牙耳…

通科技新品亮相:4K60编解一体,USB透传无忧

在信息化快速发展的今天&#xff0c;音视频技术的需求与应用场景日益丰富&#xff0c;特别是在对视频画质和实时性要求极高的领域中&#xff0c;如军警、公安、金融等&#xff0c;对音视频处理设备的性能要求更为严格。为满足这些高端应用场景的需求&#xff0c;视通科技紧跟时…

【Node.js从基础到高级运用】十八、Node.js的安全性加固

引言 在Web开发中&#xff0c;安全性是一个不可忽视的话题。Node.js作为一个流行的后端平台&#xff0c;同样需要关注各种潜在的安全威胁&#xff0c;并采取措施加以防御。本文将介绍如何在Node.js应用中防御常见的Web攻击&#xff0c;以及如何使用安全相关的中间件来加固安全性…

MySQL-1.数据库的基本操作

1. 数据库的基本操作 show databases; information_schema&#xff1a;信息图式&#xff0c;存储服务器管理数据库的信息 mysql&#xff1a;存放系统信息&#xff0c;用户名密码等 performance_schema&#xff1a;性能图式 sys&#xff1a;系统文件 1.1 创建数据库-studen…