Object类的重要方法
2015-07-23 14:44
549 查看
(博主自注:博主被阿里巴巴面试的题)
Object是所有类的最终祖先。,可以使用Object类引用任何类型的对象。在Java中,只有基本类型不是对象。
但是,我们一般意义上的相等不仅仅是具有相同的引用,如果另个对象的状态相等,就认为另个对象是相等的。所以,子类要重写超级类中的equals方法。
Java中,要求equals方法具有下面的特性:
自反性,x.equals(x)返回ture。
对称性,x.equals(y),和y.equals(x)返回相同的值。
传递性,对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也要返回true。
一致性,如果x和y所引用的对象没有变化,反复调用x.equals(y)应该返回同样的结果。
对于任意非空引用x,x.euqals(null)应该返回false。
如下例,实现了俩个equals方法:
注意:如果重写了equals方法,则必须重写HashCode方法,因为这两个方法必须一致:如果equals方法返回true,则HashCode方法必须返回相同值。
下例中,String类已经重写了HashCode方法,使用对象的值导出散列码,而StringBuilder方法没有重写HashCode方法,返回的依然是存储单元的地址。
而在大多数情况下,它用于返回表示对象值的字符串。
绝大多数的toString方法都遵循这个格式: 类名[域值,域值,域值......]
如下例:
其实,只要对象与一个字符串通过操作符“+”连接起来,Java编译就会自动的调用toString方法,以便获得这个对象的字符串描述。
Object是所有类的最终祖先。,可以使用Object类引用任何类型的对象。在Java中,只有基本类型不是对象。
Equals()方法
Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。但是,我们一般意义上的相等不仅仅是具有相同的引用,如果另个对象的状态相等,就认为另个对象是相等的。所以,子类要重写超级类中的equals方法。
Java中,要求equals方法具有下面的特性:
自反性,x.equals(x)返回ture。
对称性,x.equals(y),和y.equals(x)返回相同的值。
传递性,对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也要返回true。
一致性,如果x和y所引用的对象没有变化,反复调用x.equals(y)应该返回同样的结果。
对于任意非空引用x,x.euqals(null)应该返回false。
如下例,实现了俩个equals方法:
package com.xujin; import java.util.Arrays; public class Test { public static void main(String[] args) { Employee employee = new Employee("Bod", 5000); Employee staff = employee; Manager manager = new Manager("Bod", 8000, 6000); System.out.println(employee.equals(new Employee("Bod", 5000)));//true System.out.println(employee.equals(staff));//true System.out.println(employee.equals(null));//false System.out.println(manager.equals(new Manager("Bod", 8000, 6000)));//true System.out.println(employee.equals(manager));//false System.out.println(employee instanceof Employee);//true System.out.println(employee instanceof Manager);//false System.out.println(manager instanceof Employee);//true //考察两个数组是否相同 System.out.println(Arrays.equals(new int[]{1,2,3}, new int[]{1,2,3}));//true } } class Employee{ public Employee(String name, double salary){ this.name = name; this.salary = salary; } public boolean equals(Object otherObject){ //如果两个对象具有相同的引用,返回true if(this == otherObject) return true; //如果otherObjext是null,返回false if(otherObject == null) return false; //如果两个对象所属的类不相同,返回false if(this.getClass() != otherObject.getClass()) return false; //此时,两个对象既不是null,他们所属的类也相同,都为Employee Employee other = (Employee)otherObject; return name.equals(other.name) && salary == other.salary; } //定义变量 private double salary; private String name; } class Manager extends Employee{ public Manager(String name, double salary, double bonus){ super(name, salary); this.bonus = bonus; } public boolean equals(Object otherObject){ if(!super.equals(otherObject)) return false; Manager other = (Manager)otherObject; return bonus == other.bonus; } private double bonus; }
HashCode()方法
散列码,是由对象导出的一个整型值。此方法是有Object定义的,返回该对象的存储地址。所以,如果有必要,子类要对HashCode方法进行重写。注意:如果重写了equals方法,则必须重写HashCode方法,因为这两个方法必须一致:如果equals方法返回true,则HashCode方法必须返回相同值。
下例中,String类已经重写了HashCode方法,使用对象的值导出散列码,而StringBuilder方法没有重写HashCode方法,返回的依然是存储单元的地址。
package com.xujin; public class Main{ public static void main(String...args){ String s1 = "Hello,world!"; String s2 = new String("Hello,world!"); System.out.println(s1.hashCode());//2007142665 System.out.println(s2.hashCode());//2007142665 StringBuilder sb1 = new StringBuilder("Hello,world!"); StringBuilder sb2 = new StringBuilder(s1); System.out.println(sb1.hashCode());//1291383602 System.out.println(sb2.hashCode());//1814462232 } }
toString()方法
在Object类中,它用于返回对象所属类名和散列码,例如package com.xujin; public class Main{ public static void main(String...args){ System.out.println(System.out);//java.io.PrintStream@6102d81c } }输出的是一个java.io.PrintStream@6102d81c,这是因为System.out所属的PrintStream类并没有覆盖Object的toString方法。
而在大多数情况下,它用于返回表示对象值的字符串。
绝大多数的toString方法都遵循这个格式: 类名[域值,域值,域值......]
如下例:
package com.xujin; public class Main{ public static void main(String...args){ Employee staff = new Employee("Bob",8000); System.out.println(staff.toString()); } } class Employee{ public Employee(String name, double salary){ this.name = name; this.salary = salary; } public String toString(){ return getClass().getName() + "[name = " + name + ", salary = " + salary + "]"; } //定义变量 private double salary; private String name; }输出将是:com.xujin.Employee[name = Bob, salary = 8000.0]
其实,只要对象与一个字符串通过操作符“+”连接起来,Java编译就会自动的调用toString方法,以便获得这个对象的字符串描述。
相关文章推荐
- Django Related objects
- Objective-C学习笔记(十二)——switch多分支语句的使用
- TaskQueS.c---分配工作并以WaitForSingleObject()等待之
- iOS Object-C 基础 UIlabel
- Objective-C学习笔记(十一)——break和continue的使用方法
- Error creating object Please verify that the Microsoft Data Access Components 2.1 (or later) have be
- Objective-C学习笔记(十)——循环语句for和do-while的使用
- Objective-C学习笔记(九)——循环语句while的使用方法
- Objective-C学习之旅 第三篇
- 无法确定 <T>T 的类型参数 ;对于上限为int,java.lang.Object 的类型变量 T,不存在唯一最大实例
- Objective-C学习笔记(八)——高级跳转语句goto使用方法
- Objective-C中的@property
- oc中alloc和new的区别
- Objective-C学习笔记(七)——if-else条件判断语句
- Objective-C学习笔记之获取私有变量的值
- Objective-C学习笔记(六)——运算符之一元运算符
- OC语言的第四天 static、self、super、继承、NSObject类、私有属性和私有方法、多态
- 简单谈谈对Object C的理解
- Objective-C设计模式——适配器Adapter(接口适配)
- Objective-C学习笔记(五)——数据类型与限定词