Java面向对象 - 常用类——Object类

news2024/9/24 11:30:49

什么是Object类

Java中有一个比较特殊的类,就是 Object类,它是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类就默认继承 Object类。因此,Object 类是 Java 类层中的最高层类,是所有类的超类。换句话说,Java 中任何一个类都是它的子类。由于所有的类都是由 Object 类衍生出来的,所以 Object 类中的方法适用于所有类。

Object类的方法

在这里插入图片描述

toString()方法

  • 在Object类里面定义toString()方法的时候返回的对象的哈希code码(对象地址字符串);

  • 可以通过重写toString()方法表示出对象的属性。
    此方法是在打印对象时被调用的,下面有两个范例,一个是没复写toString()方法,另一个是复写了 toString()方法,读者可比较两者的区别。

package educoder;
public class TestToStringDemo1 {
    public static void main(String[] args) {  
        Person p = new Person();  
        System.out.println(p);  
    }  
}  
class Person extends Object {  
    String name = "张三";  
    int age = 18;  
}  

输出结果:
educoder.Person@7852e922

从上面的程序中可以发现,在打印对象p的时候实际上打印出的是一些无序的字符串,这样的字符串很少有人能看懂什么意思,之后可以再观察下面的范例,下面的范例复写了Object类中的 toString()方法。

package educoder;
public class TestToStringDemo2 {  
    public static void main(String[] args) {  
        Person p = new Person();  
        System.out.println(p);  
    }  
}  
class Person extends Object {  
    String name = "张三";  
    int age = 18;
    // 复写Object类中的toString()方法  
    public String toString() {  
        return "我是:" + this.name + ",今年:" + this.age + "岁";  
    }  
}  

输出结果:
我是:张三,今年:18岁

与 TestToStringDemo1.java 程序相比,程序TestToStringDemo2.java 在 Person
类中明确复写了 toString()方法,这样在打印对象p的时候,实际上是去调用了 toString()方法,只是并没有明显的指明调用 toString()方法而已,此时第 6 行相当于:

System.out.println(p.toString());

关于equals()方法

比较的是对象的引用是否指向同一块内存地址,一般情况下,比较两个对象时是比较它的值是否一致,那如何解决呢?思路也比较简单,重写equals()方法。

在不重写的情况下,我们先看下程序执行情况,创建两个相同类型的对象,并判断对象是否相等。

package educoder;
public class test {  
    public static void main(String[] args) {  
        Dog dog = new Dog();  
        dog.name = "jack";  
        Dog dog1 = new Dog();  
        dog1.name = "jack";  
        System.out.println(dog);  
        System.out.println(dog1);  
        if (dog.equals(dog1)) {  
            System.out.println("两个对象是相同的");  
        } else {  
            System.out.println("两个对象是不相同的");  
        }  
    }  
}
class Animal {  
}
class Dog extends Animal {  
    int age = 20;  
    String name = "rose";
    public String toString() {  
        return "Dog [age=" + age + ", name=" + name + "]";  
    }  
    }  

输出结果:
Dog [age=20, name=jack]
Dog [age=20, name=jack]
两个对象是不相同的

分析下 : 两个对象分别new了一次,开辟了两个不同内存空间,内存地址不同。object提供的equals()是用来比较的是对象的引用是否指向同一块内存地址。很显然,内存地址不一样,所以是不相等的,跟属性值是否一样完全没有任何关系。

一般情况下,我们是需要判断对象的属性值相等的,那么如何重写 equals()方法呢?通过Eclipse(集成开发环境)提供的快捷键,Dog类中出现如下方法,方法的解释也放在代码中一并进行解释如下:

package educoder;
public class test {  
    public static void main(String[] args) {  
        Dog dog = new Dog();  
        dog.name = "jack";  
        Dog dog1 = new Dog();  
        dog1.name = "jack";  
        System.out.println(dog);  
        System.out.println(dog1);  
        if (dog.equals(dog1)) {  
            System.out.println("两个对象是相同的");  
        } else {  
            System.out.println("两个对象是不相同的");  
        }  
    }  
}
class Animal {  
}
class Dog extends Animal {  
    int age = 20;  
    String name = "rose";
    public String toString() {  
        return "Dog [age=" + age + ", name=" + name + "]";  
    }
    /* getClass() 得到的是一个类对象 */  
    @Override  
    public boolean equals(Object obj) {  
        if (this == obj)// 两个对象的引用是否相同,如果相同,说明两个对象就是同一个  
            return true;  
        if (obj == null)// 如果比较对象为空,不需要比较,肯定不相等  
            return false;  
        if (getClass() != obj.getClass())// 比较两个对象的类型是否相同,如果不同,肯定不相同  
            return false;  
        Dog other = (Dog) obj;// 转化成相同类型后,判断属性值是否相同  
        if (name == null) {  
            if (other.name != null)  
                return false;  
        } else if (!name.equals(other.name))  
            return false;  
        return true;  
    }  
}

输出结果:
Dog [age=20, name=jack]
Dog [age=20, name=jack]
两个对象是相同的

equals() 和 == 的区别:

  • 在Java中,任何类型的数据都可以用 “==”进行比较是不是相等,一般用于基本数据类型的比较,比较器存储的值是否相等。但是如果用于引用类型的比较,则是比较所指向对象的地址是否相等,在这点上,跟object类提供的equals()方法的作用是一致的。
  • 对于equals()方法
    1. 首先,不能用于基本数据类型的变量之间的比较相等;

    2. 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    3. 诸如String、Date等类都对equals方法进行了重写,比较的是所指向的对象的内容。

Java对象克隆

对象克隆是一种创建对象的精确副本的方法。 Object类的clone()方法用于克隆对象。java.lang.Cloneable接口必须由我们要创建其对象克隆的类实现。如果我们不实现Cloneable接口,clone()方法将生成CloneNotSupportedException。

clone()方法在Object类中定义。 clone()方法的语法如下:
protected Object clone() throws CloneNotSupportedException

为什么要使用clone()方法?

clone()方法保存用于创建对象的精确副本的额外处理任务。 如果我们使用new关键字执行它,它将需要执行大量的处理,这就是为什么我们使用对象克隆。
对象克隆的优点:
少处理任务。
clone()方法示例(对象克隆)

package educoder;
public class Student implements Cloneable {  
    int rollno;  
    String name;
    Student(int rollno, String name) {  
        this.rollno = rollno;  
        this.name = name;  
    }
    public Object clone() throws CloneNotSupportedException {  
        return super.clone();  
    }
    public static void main(String args[]) {  
        try {  
            Student s1 = new Student(101, "amit");  
            Student s2 = (Student) s1.clone();  
            System.out.println(s1.rollno + " " + s1.name);  
            System.out.println(s2.rollno + " " + s2.name);  
        } catch (CloneNotSupportedException c) {  
        }
    }  
}  

输出结果:
101 amit
101 amit

从上面的例子可以看出,两个引用变量都有相同的值。 因此,clone()将对象的值复制到另一个对象。 因此,在实际应用中我们不需要编写显式代码将对象的值复制到另一个对象。如果通过new关键字创建另一个对象并将另一个对象的值赋给这个对象,则需要对该对象进行大量处理。 所以为了节省额外的处理任务,我们使用clone()方法。

编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

Demo类和Person类已经写好,在测试类中创建Demo类对象d1,传入输入值num1, d1调用toString方法并打印输出该值;

创建Demo类对象d2,同样传入输入值num1,打印判断d1和d2是否相等(实际是比较地址);

创建Person类对象p,传入输入值num2,打印判断d1和p是否相等(实际是比较地址);

package case1;

import java.util.Scanner;

public class ObjectTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num1 = sc.nextInt();
		int num2 = sc.nextInt();
		// 在测试类中创建Demo类对象d1,传入输入值num1, d1调用toString方法并打印输出该值
		// 创建Demo类对象d2,同样传入输入值num1,打印判断d1和d2是否相等(实际是比较地址)
		/********* Begin *********/
        Demo d1 = new Demo(num1);
        System.out.println(d1.toString());
        Demo d2 = new Demo(num1);
        if(d1.equals(d2)){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
        Person p = new Person(num2);
        if(d1.equals(p)){
            System.out.println("true");
        }else{
            System.out.println("false");
        }

		/********* End *********/
		// 创建Person类对象p,传入输入值num2,打印判断d1和p是否相等(实际是比较地址)
		/********* Begin *********/

		/********* End *********/
	}
}

class Demo {
	private int num;

	public Demo(int num) {
		this.num = num;
	}

	public boolean equals(Object obj) // Object obj = new Demo()
	{
		if (!(obj instanceof Demo)) // 判断obj是否和Demo是同类
			return false;
		Demo d = (Demo) obj; // 将父类的引用(Object)向下转换为子类(Demo)
		return this.num == d.num;
	}

	public String toString() {
		return "Demo:" + num; // 返回对象的值(每一个对象都有自己的特定的字符串)
	}
}

class Person {
	private int num;

	public Person(int num) {
		this.num = num;
	}
}

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

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

相关文章

【C语言进阶篇】指针都学完了吧!那回调函数的应用我不允许还有人不会!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言💬 函数指针数组💭 函数指针数组的定义💭 函数指针数组的…

Android性能优化之游戏引擎初始化ANR

近期,着手对bugly上的anr 处理,记录下优化的方向。 借用网上的一张图: 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。 问题1 ja…

Java Servlet实现下拉选择查询(双表)和单列模式

0目录 1.Servlet实现下拉选择查询(双表) 2.单列模式 1.Servlet实现下拉选择查询(双表) 新建数据库和表 实体类 接口方法 实现接方法 Servlet类 Web.xml List.jsp 页面效果 加入功能 2.单列模…

批发零售进销存哪个好?盘点5款主流批发零售进销存软件!

在我看来,几乎没有批发零售行业不需要做进销存管理,哪怕是路边一个小摊贩,也需要做进销存管理,但是传统的进销存过程中存在很多问题: 前后方协作困难:采购/销售/财务工作相互独立,工作入口不一…

机器学习深度学习——多层感知机

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——感知机 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 上一节…

Java阶段五Day14

Java阶段五Day14 文章目录 Java阶段五Day14分布式事务整合demo案例中架构,代码关系发送半消息本地事务完成检查补偿购物车消费 鲁班周边环境调整前端启动介绍启动前端 直接启动的项目gateway(网关)login(登录注册)atta…

DSA之图(4):图的应用

文章目录 0 图的应用1 生成树1.1 无向图的生成树1.2 最小生成树1.2.1 构造最小生成树1.2.2 Prim算法构造最小生成树1.2.3 Kruskal算法构造最小生成树1.2.4 两种算法的比较 1.3 最短路径1.3.1 两点间最短路径1.3.2 某源点到其他各点最短路径1.3.3 Dijkstra1.3.4 Floyd 1.4 拓扑排…

数据库表结构导出成文档

1.需求说明 在系统交付的过程中,有时候需要交付数据库的表结构,如果系统做的比较大,比如几百张表的时候,靠人力一张表一张的写,那就是一个奔溃啊。所以今天特意找了一下工具,小巧安装。比较好用。 2.安装…

新型恶意软件DecoyDog正大规模入侵DNS

安全厂商 Infoblox 的调查研究显示,一个名为 DecoyDog(诱饵狗)的复杂恶意工具包通过域名系统(DNS),从事网络间谍活动已达1年以上。 目前尚不清楚该恶意软件的幕后黑手是谁,但 Infoblox 的研究人…

通过REST API接口上传Nexus仓库

一、Nexus API文档 API文档链接:Components API 二、上传API接口说明 在Nexus中可以直接调试api接口,url参考:http://localhost:8081/#admin/system/api 三、上传请求案例 $ curl -X POST "http://localhost:8081/service/rest/v1/c…

营销系统积分数据库设计

营销系统总体数据-业务功能模型 在当今日益竞争的市场中,如何提高客户留存率和忠诚度,已成为各大企业迫切需要解决的问题。而积分商城/系统作为一种新型的营销方式,受到青睐。 积分商城/系统是指将用户在使用产品或服务时产生的积分&#xf…

2023扩散模型最新技术进展汇总

随着Stable Diffusion和Midjourney等图像生成模型的爆火,今年在模型领域,扩散模型稳占主导地位。因此,与之相关的新技术也层出不穷,短短1个月,扩散模型相关的论文就有上百篇了,可见其发展的火热趋势。 这次…

java注解@FeignClient修饰的类路径不在spring boot入口类所在的包下,有哪几种处理方式?

一、注解EnableFeignClients 修饰在spring boot入口类&#xff0c;使得openfeign的FeignClient注解生效。 我们进一步看看注解EnableFeignClients的使用方式。 String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] clie…

额外题目第1天|1365 941 1207 283 189 724 34 922 35 24

1365 暴力解法也能过 class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> result(nums.size(), 0);for (int i0; i<nums.size(); i) {int count 0;for (int j0; j<nums.size(); j) {if (nums[j]<…

互联网时代,企业经营管理面临的挑战有哪些?

随着科学技术的进步和社会经济的发展&#xff0c;大数据已经被应用到各个行业领域中&#xff0c;尤其在企业经营管理方面。通过对企业内部数据信息的利用&#xff0c;企业内部经营管理能力得到提升&#xff0c;那么在大数据时代&#xff0c;企业经营管理面临的挑战有哪些呢&…

C/C++几个关键知识点记录

1.将一个数值作为函数执行 (*(void(*)())0x13)();同理也可以将数值换成一个变量&#xff1a; int var0x13; (*(void(*)())var)();2.断言assert 用于判断输入的参数是否正确&#xff0c;实际就是判断输入的参数是否为0&#xff0c;如STM32的固件库中常用的assert_param()&…

Ceph入门到精通- Linux 磁盘管理(block 与 inode)

1 硬盘 block 与 inode 详解 1.1 Sector&#xff08;扇区&#xff09;与 Block&#xff08;块&#xff09; 1&#xff09; 硬盘的最小存储单位&#xff1a;sector&#xff08;扇区&#xff09;&#xff0c;每个扇区储存 512 字节&#xff1b;操作系统会一次性连续读取多个…

抖音短视频seo矩阵系统源码开发部署技术分享

抖音短视频的SEO矩阵系统是一个非常重要的部分&#xff0c;它可以帮助视频更好地被搜索引擎识别和推荐。以下是一些关于开发和部署抖音短视频SEO矩阵系统的技术分享&#xff1a; 一、 抖音短视频SEO矩阵系统的技术分享&#xff1a; 关键词研究&#xff1a;在开发抖音短视频SEO矩…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头。

✍️作者简介&#xff1a;沫小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北 CSDN、51cto博客、稀土掘金、简书、知乎、开源中国、博客园、慕课网 &#x1f310;系列专栏&#xff1a;码农小北 &#x1f514;如果文…

防止连点..

1.连点js文件 let timer; letflag /*** 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次** param {Function} func 要执行的回调函数* param {Number} wait 延时的时间* param {Boolean} immediate 是否立即执行* return null*/ function throttle(func, wait 500…