-
目录
Object是Java默认提供的类
- Java除了Object类,所有的类都存在继承关系,默认会继承Object父类,所有类对象都可以通过Object类进行接收。
1.取得对象信息——toString( )
- 直接使用对象输出,默认输出一个地址编码;如果输出的是String对象,此时输出字符串内容而非地址。
原因:String类覆写了Object的toString( )方法
- 系统输出默认会调用对象的toString( )
- 如果默认给出的toString( )功能不足(想要输出本类信息),需要在子类中覆写toString( )方法。
/**
* Object类的toString()
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
代码示例:
public class ObjectTest1 {
public static void main(String[] args) {
fun(new Person("张三",25)); //覆写前:Person@1540e19d 覆写后:姓名:张三 年龄:25
fun("hello"); //hello
}
public static void fun(Object obj) {
System.out.println(obj.toString());
//等同于下行代码
System.out.println(obj);
}
}
class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
//覆写toString()
public String toString() {
//大量拼接字符串-> StringBuffer/StringBuilder
return "姓名:"+this.name+" 年龄:"+this.age;
}
}
2.对象比较——equals( )
String类的equals( )方法就是覆写的Object类中的equals( )方法。
- 要比较一个类中两个对象的属性,覆写equals( )
- 先判断obj是否是该类的实例(是->2)
- 再判断是否是与自己比较(是->3)
- 向下转型,取得属性并比较
/**
* Object类的equals()
*/
public boolean equals(Object obj) {
return (this == obj);
}
/**
* String类的覆写equals()
*/
public boolean equals(Object anObject) {
//如果地址相等,则内容必然相等
if (this == anObject) {
return true;
}
//equals()中传入的是Object类的参数
//需要先判断参数对象能否由String实例化
//不能,则无法比较,返回false
//能,转换 -> 比较每一个字符
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
代码示例:
/**
* 自定义覆写equals()
* Author:qqy
*/
public class ObjectTest2 {
public static void main(String[] args) {
Person per1=new Person("李四",20);
Person per2=new Person("李四",20);
System.out.println(per1.equals(per2)); //true
System.out.println(per1.equals(new ObjectTest2())); //false
}
}
class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
//如果不覆写equals则原equals(Object obj) 返回(this == obj)
//相当于per1==per2
public boolean equals(Object obj) {
if(obj==null){
return false;
}
//obj是自己(地址) —— 同一个对象
if(obj==this){
return true;
}
//判断obj是否是Person的实例
if (!(obj instanceof Person)) {
return false;
}
//同一个类的不同对象(内容)
//因为Object类没有name、age属性
//向下转型,取得Person类的name、age的属性
Person per = (Person) obj;
//分别比较name,age
return per.name.equals(this.name)&&(per.age==this.age);
}
}
3.接收引用数据类型
Object类可以接收Java所有引用数据类型的对象,包括数组、类、接口。对于基本数据类型对象,则是由jdk将基本数据类型自动装箱后,被Object类接收。
- 类和接口等级相同,两者之间不可继承/实现,但是Java中强制要求Object可以接收接口。
- 包装类型 —— 引用数据类型
代码示例:
public class ObjectTest3 {
public static void main(String[] args) {
//Object接收数组对象
Object obj = new int[]{1,3,5,7,9};
//向下转型,需强转
int[] data = (int[]) obj;
System.out.println(data[0]); //1
//Object接收接口对象
IMessage msg = new MessageImpl();
Object obj1 = msg;
//Object中没有test(),所以将obj1向下转型
((IMessage) obj1).test(); //bonjour!
System.out.println(obj1); //默认调用to.String() //MessageImpl@1540e19d
//obj2接收整型(基本数据类型) —— 基本数据类型被包装为包装类型
Object obj2 = 10;
System.out.println(obj2);
}
}
interface IMessage{
void test();
}
class MessageImpl implements IMessage{
@Override
public void test() {
System.out.println("bonjour!");
}
}