Object 类入门
来源:互联网 发布:厂品商设计软件 编辑:程序博客网 时间:2024/06/06 03:40
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方法:
[java] view plaincopy
- 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方法,返回的依然是存储单元的地址。
[java] view plaincopy
- 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类中,它用于返回对象所属类名和散列码,例如
[java] view plaincopy
- 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方法都遵循这个格式:类名[域值,域值,域值......]
如下例:
[java] view plaincopy
- 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方法,以便获得这个对象的字符串描述。
在类的equals()定义中,应该接受Object类型的形参,否则会有适用范围的局限。
- Object 类入门
- object 入门
- Mock Object 入门
- object-c 快速入门
- Object Pascal入门
- Object-C 入门
- Object-C大五码入门
- OBJECT ARX 入门
- Object-C 入门
- Object-C 入门
- Object-C 入门
- Object-C 入门
- Object C 入门基础
- Object-c入门笔记
- object-c快速入门
- [Object-C] AutoLaout入门
- Object-C 入门
- Object C 语法入门
- golang todo实例
- hdu 5014 亦或的性质
- PrinterWriter 类入门
- Path Sum
- POJ 1087 A Plug for UNIX(最大流dinic)
- Object 类入门
- Android NDK 学习(2) NDK能做什么?
- vmware上运行nbp
- next与nextLine区别探讨
- Android开发—内存优化(初步)
- mutex 和 spinlock 对比
- Android异步加载图像(含线程池,缓存方法)
- VBA 学习笔记 4
- 字符串总结