Object类

本文介绍了Java中Object类的基本概念。它是所有类的父类,可接收一切引用数据类型,实现参数统一。还阐述了Object类的toString()方法用于取得对象信息,equals()方法用于对象比较,且这两个方法可应用在简单Java类中。

Object类的基本概念

虽然参数转型可以解决参数的统一问题,但是面对Java之中如此之多的开发类,所以现在就面临这样一个问题,参数对象要怎样选择才能保存所有的类对象呢?为此,考虑到此种情况,Java中提供了Object类,此类的定义如下:

public class Object

可以发现在整个的Java中,只有Object类在定义的时候没有定义父类,而其他的所有类都是Object类的子类。也就是说在Java中除了Object类之外,其他的类都存在有继承关系。

public class Person{}public class Person extends Object{}

理论上如果定义一个类的时候没有继承任何的父类,那么其将默认继承Object类。这样的直接好处是所有的对象都可以使用Object类来接收。
范例:利用Object接收对象

class Person{	
}
public class Hello{
	public static void main(String args[]){
		Object obj = new Person();//向上转型
	}
}

利用Object可以实现最终的参数统一。
清楚了Object类的作用之后,下面要完善一些操作:

  • 在简单Java类的时候需要提供有一个getInfo()方法已返回对象信息;
  • 在进行简单Java类对象的比较时要准备一个compare()方法进行比较。
    那么从现在开始以上的两个方法需要换名了,在Object类里面定义有以下的两个匹配方法
  • 取得对象信息: public String toString();
  • 对象比较:publicboolean equals(Object obj)。

取得对象信息(toString()方法)

如果说现在直接输出一个对象,默认输出的是一个对象地址编码。
范例:观察默认的toString()

class Person{	
}
public class Hello{
	public static void main(String args[]){
		Person p = new Person();
		System.out.println(p);//Person@15db9742
		System.out.println(p.toString());//Person@15db9742
	}
}

通过此时的情况可以发现,在默认情况下如果要输出一个对象,都会执行toString的方,不管是否显示调用此方法。于是Object类对于此方法就有一个自己的默认实现,虽然不知道每个对象输出时都需要哪些,但是至少知道,每个对象存在都会有一个地址编码,所以默认的输出是对象的编码信息。
如果用户现在不希望输出编码,而希望输出具体的内容,则可以进行方法的覆写。
范例:覆写toString()方法

class Person{	
	private String name;
	private int age;
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String toString(){
		return "姓名:"+this.name+",年龄:"+this.age;
	}
}
public class Hello{
	public static void main(String args[]){
		Person p = new Person("张三",30);
		System.out.println(p);//姓名:张三,年龄:30
	}
}

toString()方法是输出调用的。

equals()方法

对象比较在之前使用过compare()方法进行表示,而且最为重要的是在之前实现对象比较时比较的流程是:地址、是否为空、属性是否相同。
范例:实现对象比较

class Person{	
	private String name;
	private int age;
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	public boolean equals(Object obj){
		if(this==obj){//地址相同
			return true;
		}
		if(obj==null){//没得比
			return false;
		}
		if(!(obj instanceof Person)){
			return false;//两个对象没关系
		}
		Person per = (Person) obj;
		if (this.name.equals(per.name)&&this.age==per.age){
			return true;
		}return false;
	}
	public String toString(){
		return "姓名:"+this.name+",年龄:"+this.age;
	}
}
public class Hello{
	public static void main(String args[]){
		Person p1 = new Person("张三",30);
		Person p2 = new Person("张三",30);
		System.out.println(p1.equals(p2));
		System.out.println(p1.equals("猪、大猪、黑猪"));
	}
}

在这里插入图片描述
从此以后,所编写对象比较操作,都以Object类的equals()方法为主。

Object类可接收一切引用数据类型

Java的引用类型包含:数组、类、接口。现在已经证明了,所有的类对象都可以使用Object进行接收,数组和接口也可以被Object接收。
范例:利用Object接收数组对象

public class Hello{
	public static void main(String args[]){
		Object obj = new int[]{1,2,3};//利用Object接收整型数组,向上转型
		if(obj instanceof int[]){//对象是否是int数组
			int data [] = (int[]) obj;//向下转型
			for(int x=0;x<data.length;x++){
				System.out.println(data[x]);
			}
		}
	}
}

除了可以接收数组外,也可以接收接口。
范例:辅助概念

interface A{
	public void printA();
}
interface B{
	public void printB();
}
class X implements A,B{
	public void printA(){
		System.out.println("AAAAAAAAAAAAAAAAAA");
	}
	public void printB(){
		System.out.println("BBBBBBBBBBBBBBBBBB");
	}
}
public class Hello{
	public static void main(String args[]){
		A a = new X();//向上转型
		B b = (B) a;//虽然A与B没有关系,但是X是B的子类;
		b.printB();
	}
}

按照以上的思路来解决Object接收接口对象的问题。
范例:用Object接收接口对象

interface A{
	public void printA();
}
class X extends Object implements A{
	public void printA(){
		System.out.println("AAAAAAAAAAAAAAAAAA");
	}
}
public class Hello{
	public static void main(String args[]){
		A a = new X();//向上转型
		Object obj=a;//向上转型
		A temp = (A) obj;//向下转型
		temp.printA();
	}
}

Object所有引用数据类型都可以接收,对于数据的统一性操作上更加方便了。

总结

  1. Object类是所有类的父类,可以接收所有引用数据类型;
  2. Object类提供的toString()与equals()方法可以应用在简单Java类之中。
### Object 的作用 在 Java 中,`Object` 是所有的根。每个无论是否显式声明继承,都会直接或间接继承自 `Object` 。这使得 `Object` 的方法能够被所有对象使用,提供了基础功能支持。`Object` 的定义确保了所有对象都具备一些通用的行为,例如对象的比较、克隆、字符串表示等。 ### 常见方法及使用 #### 1. `toString()` 此方法返回对象的字符串表示形式。默认情况下,返回的字符串格式为 `名@哈希码`,例如 `java.lang.Object@1b6d3586`。在实际开发中,通常会重写此方法以提供更有意义的对象描述。 示例: ```java Object obj = new Object(); System.out.println(obj.toString()); // 输出:java.lang.Object@哈希码 ``` 重写示例: ```java @Override public String toString() { return "Custom String Representation"; } ``` #### 2. `equals(Object obj)` 默认情况下,`equals()` 方法用于比较两个对象的引用是否指向同一个对象实例。然而,在实际开发中,通常需要根据对象的实际属性来判断相等性,因此需要重写此方法。例如,当对象被存储在 `Map` 或 `Set` 中时,如果两个对象的 `hashCode()` 相同,则会调用 `equals()` 方法进行进一步比较。 #### 3. `hashCode()` 此方法返回对象的哈希码值。通常与 `equals()` 方法一起重写,以确保两个相等的对象具有相同的哈希码。这对于基于哈希的集合(如 `HashMap` 和 `HashSet`)的正确行为至关重要。 #### 4. `clone()` 此方法用于创建并返回对象的一个副本。要使用此功能,需要实现 `Cloneable` 接口并重写 `clone()` 方法,否则会抛出 `CloneNotSupportedException` 异常。 #### 5. `getClass()` 此方法返回运行时的 `Class` 对象,可以用于反射操作。 #### 6. `notify()` 和 `wait()` 这些方法用于线程间的协作。`wait()` 方法使当前线程等待,直到另一个线程调用 `notify()` 或 `notifyAll()` 方法。 ### Object 的重要性 由于 `Object` 是所有的超,因此它提供了一种统一的方式来处理所有对象。例如,可以通过 `Object` 型的引用变量来引用任何型的对象,从而实现多态性。 此外,`Object` 提供的方法为对象的基本操作奠定了基础。例如,`toString()` 方法使得对象可以以字符串形式输出,便于调试;`equals()` 和 `hashCode()` 方法确保了对象在集合中的正确行为;`clone()` 方法提供了对象复制的机制。 ### 示例代码 以下是一个重写 `toString()` 和 `equals()` 方法的示例: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值