一:Object工具类
简介:Object是类结构的根,所有的类都有Object作为超类,所有的对象,包括数组实现这个类的功能。
构造方法:Object()
常用方法:Object的常用方法有4个他们分别是:equls(); hashCode(); tostring(); getClass();
1、equls();
equals()这个方法:是将两个类进行比较。返回值为true或者false。
使用方法:
public class Test_Equals {
public static void main(String[] args) {
Student s1=new Student("张亮",28);
Student s2=new Student("张亮",28);
System.out.println(s1.equals(s2));
}
}
class Student{
//属性
String name;
int age;
//构造方法
public Student(){}
// source->Generate Constructor Using Field
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
结果:
我们可以看到,即使给两个对象赋的值即使相等,这里的比较结果也为false,那是因为底层中比较的是两个对象的地址值,我们可以看一下底层代码:
public boolean equals(Object obj) { return (this == obj); }
在这里我们可以看到,是将两个类的对象进行==比较。这里的等等:如果进行比较的两个值是基本类型,那么,直接进行值的比较,如果要进行比较的是两个对象,那么,是两个对象在内存中的地址值在进行比较。
如果仅仅是想认为两个对象的属性相同就相等呢,再直接调用Object里的方法就不适用了。那么我们就需要在子类中进行重写:可以写成这样:
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }
这个重写的方法不需要我们自己重写,可以通过
鼠标右击-->source-->Generate hashCode and equals().....来创建。
再进行比较:
public class Test_Equals {
public static void main(String[] args) {
Student s1=new Student("张亮",28);
Student s2=new Student("张亮",28);
System.out.println(s1.equals(s2));
}
}
class Student{
//属性
String name;
int age;
//构造方法
public Student(){}
// source->Generate Constructor Using Field
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
结果:
2、toString
toString方法可以更加方便我们获取对象的属性。如果没有toString,我们获取对象的属性值有两种方法,一种是创建对象,通过对象直接调用该对象的属性值,但是这种方法不是很安全,因为它不能将类中的属性定义成private类型,不能进行封装。第二种是在类中定义get方法,通过创建对象,来调用get方法,最终得到对象的属性。但是一个一个的获取,实在太麻烦了,这时候toString方法的好处就来了。
使用方法:
public class Test_Equals {
public static void main(String[] args) {
//equals方法的使用
Student s1=new Student("张亮",28);
Student s2=new Student("张亮",28);
// System.out.println(s1.equals(s2));
//toString
System.out.println(s1.toString());
}
}
class Student{
//属性
String name;
int age;
//构造方法
public Student(){}
// source->Generate Constructor Using Field
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写equals
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//
}
结果:
这里可以看到,直接输出的toString打印出了一串地址值,这是因为其源码是这样的:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
我们可以看到,它输出的是通过hashCode方法得出的地址值与类名,包名进行拼接的,那么要想得到我们所希望的直接输出对象的属性,在子类里,需要进行重写。像这样:
@Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; }
这个方法我们也不需要自己写,可以通过:
鼠标右击-->source-->Generate toString()......来创建。
测试一下:
public class Test_Equals {
public static void main(String[] args) {
//equals方法的使用
Student s1=new Student("张亮",28);
Student s2=new Student("张亮",28);
// System.out.println(s1.equals(s2));
//toString
System.out.println(s1.toString());
}
}
class Student{
//属性
String name;
int age;
//构造方法
public Student(){}
// source->Generate Constructor Using Field
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写equals
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//重写toString
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
结果:
3、hashCode
这个函数可以返回对象的哈希代码值。每个对象在创建的时候都会分配一串哈希代码值作为地址。可以通过hashCode()方法获得。
测试:
public class Test_Equals {
public static void main(String[] args) {
//equals方法的使用
Student s1=new Student("张亮",28);
Student s2=new Student("张亮",28);
// System.out.println(s1.equals(s2));
//toString
// System.out.println(s1.toString());
System.out.println(s1.hashCode());
}
}
class Student{
//属性
String name;
int age;
//构造方法
public Student(){}
// source->Generate Constructor Using Field
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写equals
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//重写toString
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
结果:
4、getClass
getClass这个方法可以返回Object运行时类,先不说。