当前位置: 首页 > 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;随便写一个简单大方的登…...

STM32智能农业大棚监控系统开发实战

1. 项目概述这个基于STM32F103C8T6的智能农业大棚监控系统&#xff0c;是我去年为一个农业科技公司开发的物联网解决方案。传统大棚管理最大的痛点就是依赖人工经验&#xff0c;农户需要频繁进出大棚检查温湿度、土壤墒情&#xff0c;不仅效率低下&#xff0c;还经常错过最佳调…...

如何永久保存你的数字生活记忆:WeChatMsg数据守护终极指南

如何永久保存你的数字生活记忆&#xff1a;WeChatMsg数据守护终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

AdminBSB表单组件实战:从基础到高级的完整解决方案

AdminBSB表单组件实战&#xff1a;从基础到高级的完整解决方案 【免费下载链接】AdminBSBMaterialDesign AdminBSB - Free admin panel that is based on Bootstrap 3.x with Material Design 项目地址: https://gitcode.com/gh_mirrors/ad/AdminBSBMaterialDesign Admi…...

07 原创:华为破局(架构师级)- 跨终端数据一致性与分布式事务冲突解决方案

原创&#xff1a;华为破局&#xff08;架构师级&#xff09;- 跨终端数据一致性与分布式事务冲突解决方案 摘要 本文从分布式操作系统内核级架构视角&#xff0c;深度剖析鸿蒙跨终端场景下数据一致性的核心诉求、分布式数据同步模型、事务管理机制&#xff0c;以及多设备并发操…...

计算机毕业设计:Python新能源汽车舆情与个性化推荐平台 Django框架 snowNLP 协同过滤推荐算法 requests爬虫 可视化(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…...

别再傻傻用IP了!用Kali+SET克隆真实网站的完整避坑指南

KaliSET钓鱼网站进阶实战&#xff1a;从克隆到高仿的避坑指南 在网络安全测试中&#xff0c;钓鱼网站的真实性直接决定了测试效果。很多初学者止步于简单的IP访问和基础模板克隆&#xff0c;却忽略了细节打磨的重要性。本文将带你突破基础操作&#xff0c;实现从"一眼假&q…...

技术方案:deepseek对话怎么导出PDF

在日常使用 DeepSeek 的过程中&#xff0c;一个让人又爱又恨的问题反复出现&#xff1a;回答质量很高&#xff0c;但想把它存下来却非常麻烦。 无论是做技术调研、写方案、做知识沉淀&#xff0c;还是整理学习笔记&#xff0c;DeepSeek 给出的答案往往信息密度大、结构清晰&am…...

OneDrive顽固残留?高效彻底卸载指南:释放系统资源的实用方案

OneDrive顽固残留&#xff1f;高效彻底卸载指南&#xff1a;释放系统资源的实用方案 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/on/OneDrive-Uninstaller 问题解析…...

基于vue的教学互动系统[vue]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着信息技术的飞速发展&#xff0c;教育领域对信息化教学的需求日益增长。为了提高教学效率和质量&#xff0c;增强师生之间的互动交流&#xff0c;本文设计并实现了一个基于Vue的教学互动系统。该系统采用前后端分离架构&#xff0c;前端利用Vue及相关技术构…...

为什么你的暗影精灵游戏本需要开源硬件控制?OmenSuperHub深度解析

为什么你的暗影精灵游戏本需要开源硬件控制&#xff1f;OmenSuperHub深度解析 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度&#xff0c;自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 在游戏本的世界里&#xff0…...