当前位置: 首页 > news >正文

Java Object类详解

Object 是 java 类库中的一个特殊类,也是所有类的父类。也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量。当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 Object 类。因此,以下两个类表示的含义是一样的。

public class MyClass{…}

等价于

public class MyClass extends Object {…}


由于 Java 所有的类都是 Object 类的子类,所以任何 Java 对象都可以调用 Object 类的方法。常见的方法如表 1 所示。
 

表 1 Object 类的常用方法
方法说明
Object clone()创建与该对象的类相同的新对象
boolean equals(Object)比较两对象是否相等
void finalize()当垃圾回收器确定不存在对该对象的更多引用时,对象垃圾回收器调用该方法
Class getClass()返回一个对象运行时的实例类
int hashCode()返回该对象的散列码值
void notify()激活等待在该对象的监视器上的一个线程
void notifyAll()激活等待在该对象的监视器上的全部线程
String toString()返回该对象的字符串表示
void wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待


其中,toString()、equals() 方法和 getClass() 方法在 Java 程序中比较常用。

toString() 方法

toString() 方法返回该对象的字符串,当程序输出一个对象或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的 toString() 方法返回该对象的字符串表示。

Object 类的 toString() 方法返回“运行时类名@十六进制哈希码”格式的字符串,但很多类都重写了 Object 类的 toString() 方法,用于返回可以表述该对象信息的字符串。

哈希码(hashCode),每个 Java 对象都有哈希码属性,哈希码可以用来标识对象,提高对象在集合操作中的执行效率。

先看以下代码:

 
  1. // 定义Demo类,实际上继承Object类
  2. class Demo {
  3. }
  4. public class ObjectDemo01 {
  5. public static void main(String[] args) {
  6. Demo d = new Demo(); // 实例化Demo对象
  7. System.out.println("不加toString()输出:" + d);
  8. System.out.println("加上toString()输出:" + d.toString());
  9. }
  10. }

输出结果为:

不加toString()输出:Demo@15db9742
加上toString()输出:Demo@15db9742

以上的程序是随机输出了一些地址信息,从程序的运行结果可以清楚的发现,加和不加 toString() 的最终输出结果是一样的,也就是说对象输出时一定会调用 Object 类中的 toString() 方法打印内容。所以利用此特性就可以通过 toString() 取得一些对象的信息,如下面代码。

 
  1. public class Person {
  2. private String name;
  3. private int age;
  4. public Person(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. public String toString() {
  9. return "姓名:" + this.name + ":年龄" + this.age;
  10. }
  11. public static void main(String[] args) {
  12. Person per = new Person("C语言中文网", 30);// 实例化Person对象
  13. System.out.println("对象信息:" + per);// 打印对象调用toString()方法
  14. }
  15. }

输出结果为:

对象信息:姓名:C语言中文网:年龄30

程序中的 Person 类中重写了 Object 类中的 toString() 方法,这样直接输出对象时调用的是被子类重写过的 toString() 方法。

equals() 方法

在前面学习字符串比较时,曾经介绍过两种比较方法,分别是==运算符和 equals() 方法,==运算符是比较两个引用变量是否指向同一个实例,equals() 方法是比较两个对象的内容是否相等,通常字符串的比较只是关心内容是否相等。

其使用格式如下:

 
  1. boolean result = obj.equals(Object o);

其中,obj 表示要进行比较的一个对象,o 表示另一个对象。

例 1

编写一个 Java 程序,实现用户登录的验证功能。要求用户从键盘输入登录用户名和密码,当用户输入的用户名等于 admin 并且密码也等于 admin 时,则表示该用户为合法用户,提示登录成功,否则提示用户名或者密码错误信息。

在这里使用 equals() 方法将用户输入的字符串与保存 admin 的字符串对象进行比较,具体的代码如下:

 
  1. import java.util.Scanner;
  2. public class Test01 {
  3. // 验证用户名和密码
  4. public static boolean validateLogin(String uname, String upwd) {
  5. boolean con = false;
  6. if (uname.equals("admin") && upwd.equals("admin")) { // 比较两个 String 对象
  7. con = true;
  8. } else {
  9. con = false;
  10. }
  11. return con;
  12. }
  13. public static void main(String[] args) {
  14. Scanner input = new Scanner(System.in);
  15. System.out.println("------欢迎使用大数据管理平台------");
  16. System.out.println("用户名:");
  17. String username = input.next(); // 获取用户输入的用户名
  18. System.out.println("密码:");
  19. String pwd = input.next(); // 获取用户输入的密码
  20. boolean con = validateLogin(username, pwd);
  21. if (con) {
  22. System.out.println("登录成功!");
  23. } else {
  24. System.out.println("用户名或密码有误!");
  25. }
  26. }
  27. }

上述代码在 validateLogin() 方法中又使用 equals() 方法将两个 String 类型的对象进行了比较,当 uname 对象与保存 admin 的 String 对象相同时,uname.equals("admin") 为 true;与此相同,当 upwd 对象与保存 admin 的 String 对象相同时,upwd.equals("admin") 为 true。当用户输入的用户名和密码都为 admin 时,表示该用户为合法用户,提示登录成功信息,否则提示用户名或密码有误的错误信息。

该程序的运行结果下所示:

------欢迎使用大数据管理平台------
用户名:
adinm
密码:
admin
用户名或密码有误!
------欢迎使用大数据管理平台------
用户名:
admin
密码:
admin
登录成功!

getClass() 方法

getClass() 方法返回对象所属的类,是一个 Class 对象。通过 Class 对象可以获取该类的各种信息,包括类名、父类以及它所实现接口的名字等。

例 2

编写一个实例,演示如何对 String 类型调用 getClass() 方法,然后输出其父类及实现的接口信息。具体实现代码如下:

 
  1. public class Test02 {
  2. public static void printClassInfo(Object obj) {
  3. // 获取类名
  4. System.out.println("类名:" + obj.getClass().getName());
  5. // 获取父类名
  6. System.out.println("父类:" + obj.getClass().getSuperclass().getName());
  7. System.out.println("实现的接口有:");
  8. // 获取实现的接口并输出
  9. for (int i = 0; i < obj.getClass().getInterfaces().length; i++) {
  10. System.out.println(obj.getClass().getInterfaces()[i]);
  11. }
  12. }
  13. public static void main(String[] args) {
  14. String strObj = new String();
  15. printClassInfo(strObj);
  16. }
  17. }

该程序的运行结果如下:

类名:java.lang.String
父类:java.lang.Object
实现的接口有:
interface java.io.Serializable
interface java.lang.Comparable
interface java.lang.CharSequence

接收任意引用类型的对象

既然 Object 类是所有对象的父类,则所有的对象都可以向 Object 进行转换,在这其中也包含了数组和接口类型,即一切的引用数据类型都可以使用 Object 进行接收。

 
  1. interface A {
  2. public String getInfo();
  3. }
  4. class B implements A {
  5. public String getInfo() {
  6. return "Hello World!!!";
  7. }
  8. }
  9. public class ObjectDemo04 {
  10. public static void main(String[] args) {
  11. // 为接口实例化
  12. A a = new B();
  13. // 对象向上转型
  14. Object obj = a;
  15. // 对象向下转型
  16. A x = (A) obj;
  17. System.out.println(x.getInfo());
  18. }
  19. }

输出结果为:

Hello World!!!

通过以上代码可以发现,虽然接口不能继承一个类,但是依然是 Object 类的子类,因为接口本身是引用数据类型,所以可以进行向上转型操作。

同理,也可以使用 Object 接收一个数组,因为数组本身也是引用数据类型。

 
  1. public class ObjectDemo05 {
  2. public static void main(String[] args) {
  3. int temp[] = { 1, 3, 5, 7, 9 };
  4. // 使用object接收数组
  5. Object obj = temp;
  6. // 传递数组引用
  7. print(obj);
  8. }
  9. public static void print(Object o) {
  10. // 判断对象的类型
  11. if (o instanceof int[]) {
  12. // 向下转型
  13. int x[] = (int[]) o;
  14. // 循环输出
  15. for (int i = 0; i < x.length; i++) {
  16. System.out.print(x[i] + "\t");
  17. }
  18. }
  19. }
  20. }

输出结果为:

1 3 5 7 9

以上程序使用 Object 接收一个整型数组,因为数组本身属于引用数据类型,所以可以使用 Object 接收数组内容,在输出时通过 instanceof 判断类型是否是一个整型数组,然后进行输出操作。

提示:因为 Object 类可以接收任意的引用数据类型,所以在很多的类库设计上都采用 Object 作为方法的参数,这样操作起来会比较方便。

相关文章:

Java Object类详解

Object 是 java 类库中的一个特殊类&#xff0c;也是所有类的父类。也就是说&#xff0c;Java 允许把任何类型的对象赋给 Object 类型的变量。当一个类被定义后&#xff0c;如果没有指定继承的父类&#xff0c;那么默认父类就是 Object 类。因此&#xff0c;以下两个类表示的含…...

Unity 中忽略图片透明度的 Image 组件的修改版本

只需将此组件添加到画布中的空对象即可。请注意&#xff0c;仅支持简单 图像类型。 using System.Collections.Generic; using UnityEngine; using UnityEngine.Sprites; using UnityEngine.UI; #if UNITY_2017_4 || UNITY_2018_2_OR_NEWER using UnityEngine.U2D; #endif#if U…...

hibernate源码(1)--- schema创建

sessionFactory 配置项&#xff1a; hibernate的核心是sessionFactory&#xff0c;那我们看看如何构建session Factory。 参考官网&#xff1a; plugins {id("java") } group "com.atai.hibernatespy" version "1.0-SNAPSHOT" repositories…...

数学与经济管理

数学与经济管理&#xff08;2-4分&#xff09; 章节概述 最小生成树问题 答案&#xff1a;23 讲解地址&#xff1a;74-最小生成树问题_哔哩哔哩_bilibili 最短路径问题 答案&#xff1a;81 讲解地址&#xff1a;75-最短路径问题_哔哩哔哩_bilibili 网络与最大流量问题 真题 讲解…...

自动化测试系列 —— UI自动化测试

UI 测试是一种测试类型&#xff0c;也称为用户界面测试&#xff0c;通过该测试&#xff0c;我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要&#xff0c;通过执行 UI 测试…...

眨个眼就学会了PixiJS

本文简介 带尬猴&#xff0c;我是德育处主任 当今的Web开发中&#xff0c;图形和动画已经成为了吸引用户注意力的重要手段之一。而 Pixi.js 作为一款高效、易用的2D渲染引擎&#xff0c;已经成为了许多开发者的首选&#xff08;我吹的&#xff09;。本文将为工友们介绍PixiJS的…...

WORD中的表格内容回车行距过大无法调整行距

word插入表格&#xff0c;编辑内容&#xff0c;换行遇到如下问题&#xff1a; 回车后行距过大&#xff0c;无法调整行距。 解决方法&#xff08;并行&#xff09;&#xff1a; 方法1&#xff1a;选中要调整的内容&#xff0c;菜单路径&#xff1a;“编辑-清除-格式” 方法2&am…...

MySQL 高级函数整理

目录 MySQL 高级函数VERSIONIFCASE参考文章 MySQL 高级函数 函数描述BIN返回数字的二进制表示BINARY将值转换为二进制字符串CASE遍历条件并在满足第一个条件时返回一个值CAST将&#xff08;任何类型的&#xff09;值转换为指定的数据类型COALESCE返回列表中的第一个非空值CONN…...

UG\NX二次开发 连接曲线、连结曲线 UF_CURVE_auto_join_curves

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介 UG\NX二次开发 连接曲线、连结曲线 UF_CURVE_auto_join_curves 效果 代码 #include "me.hpp" extern DllExport void ufusr(char* param, int* returnC…...

python爬虫入门(四)爬取猫眼电影排行(使用requests库和正则表达式)

本例中&#xff0c;利用 requests 库和正则表达式来抓取猫眼电影 TOP100 的相关内容。 1.目标 提取出猫眼电影 TOP100 的电影名称、时间、评分、图片等信息&#xff0c;提取的站点 URL 为 http://maoyan.com/board/4&#xff0c;提取的结果会以文件形式保存下来。 2.抓取分析…...

Mybatis-Plus CRUD

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Mybatis-Plus CRUD 通用 Service CRUD 封装 IService 接口&#xff0c;进一步封装 CRUD 采用 get 查询、remove 删除 、list 查询集合、page 分页的前缀命名方式区分 …...

【强化学习】08——规划与学习(采样方法|决策时规划)

文章目录 优先级采样Example1 Prioritized Sweepingon Mazes局限性及改进 期望更新和采样更新不同分支因子下的表现 轨迹采样总结实时动态规划Example2 racetrack 决策时规划启发式搜索Rollout算法蒙特卡洛树搜索 参考 先做个简单的笔记整理&#xff0c;以后有时间再补上细节 …...

(链表) 25. K 个一组翻转链表 ——【Leetcode每日一题】

❓ 25. K 个一组翻转链表 难度&#xff1a;困难 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保…...

VisualStudio[WPF/.NET]基于CommunityToolkit.Mvvm架构开发

一、创建 "WPF应用程序" 新项目 项目模板选择如下&#xff1a; 暂时随机填一个目标框架&#xff0c;待会改&#xff1a; 二、修改“目标框架” 双击“解决方案资源管理器”中<项目>CU-APP, 打开<项目工程文件>CU-APP.csproj, 修改目标框架TargetFramew…...

深度学习_5_模型拟合_梯度下降原理

需求: 想要找到一条直线&#xff0c;能更好的拟合这一些点 如何确定上述直线就是最优解呢&#xff1f; 由计算机算出所有点与我们拟合直线的误差&#xff0c;常见的是均方误差 例如&#xff1a;P1与直线之间的误差为e1 将P1坐标带入直线并求误差得&#xff1a; 推广到所有点&a…...

大模型时代,AI如何成为数实融合的驱动力?

10月25日&#xff0c;百度APP、百家号联合中兴通讯举办的“时代的增量“主题沙龙第二期在北京顺利召开。本期沙龙围绕“数实融合新视角”邀请学界、业界、媒体从业者等领域专家出席&#xff0c;以产学研相结合的视角深入探讨数实融合的最新技术趋势&#xff0c;并围绕数实融合在…...

MS COCO数据集的评价标准以及不同指标的选择推荐(AP、mAP、MS COCO、AR、@、0.5、0.75、1、目标检测、评价指标)

目标检测模型性能衡量指标、MS COCO 数据集的评价标准以及不同指标的选择推荐 0. 引言 0.1 COCO 数据集评价指标 目标检测模型通过 pycocotools 在验证集上会得到 COCO 的评价列表&#xff0c;具体参数的含义是什么呢&#xff1f; 0.2 目标检测领域常用的公开数据集 PASCAL …...

css实现鼠标多样化

cursor pointer&#xff1a; 手型default&#xff1a; 箭头text&#xff1a; 文本输入光标move&#xff1a; …...

21.2 Python 使用Scapy实现端口探测

Scapy 是一款使用纯Python编写的跨平台网络数据包操控工具&#xff0c;它能够处理和嗅探各种网络数据包。能够很容易的创建&#xff0c;发送&#xff0c;捕获&#xff0c;分析和操作网络数据包&#xff0c;包括TCP&#xff0c;UDP&#xff0c;ICMP等协议&#xff0c;此外它还提…...

Qt设计一个自定义的登录框窗口

今天写了一个Qt登录、注册的小demo&#xff0c;后续完善会连接MySQL使用&#xff0c;过几天写完我会放在github上。 主要页面&#xff1a; 动态演示&#xff1a; 写完这个界面后&#xff0c;我终于知道了Qt为什么几乎没什么好看的窗口设计了&#xff0c;随便写一个简单大方的登…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...