toString方法和equals方法的使用方法
11.2.4 toString()方法
- public String toString(){}
- 返回该对象的字符串表示(表现形式);
- 可以根据程序需求覆盖该方法,如,展示对象各个属性值; ‘
public class TestMethodToString {
public static void main(String[] args) {
//获取对象的字符串表现形式
Object obj = new Object();
System.out.println(obj.toString());
Fish fish = new Fish();
Bird bird = new Bird();
System.out.println(fish.toString());
System.out.println(bird);//打印对象:实质打印的就是该对象的toString方法
System.out.println(bird.toString());
System.out.println(bird.hashCode());
System.out.println("------------------------");
//getClass()获得了对象的真实类型 + @ + 16进制的哈希码
System.out.println(bird.getClass().getName() +"#" );
}
}
class Fish {}
class Bird {}
输出结果:
java.lang.Object@7852e922
com.qf.Day20.Fish@4e25154f
com.qf.Day20.Bird@70dea4e
com.qf.Day20.Bird@70dea4e
118352462
------------------------
com.qf.Day20.Bird#
可以看到输出一个类就是在输出该类的toString方法返回值,默认的toString()方法的输出接口就是“getClass()获得的对象的真实类型 + @ + 16进制的哈希码”。
- 当我们覆盖了toString()方法,就可以自定义输出规则:
public class TestMethodToString2 {
public static void main(String[] args) {
Worker w1 = new Worker();
w1.name = "tom";
w1.age = 20;
w1.sex = "男";
w1.salary = 9000D;
System.out.println(w1);
System.out.println(w1.toString());
}
}
class Worker{
String name;
int age;
String sex;
double salary;
//覆盖父类方法
@Override
public String toString() {
return "Worker [name=" + name + ", age=" + age + ", sex=" + sex + ", salary=" + salary + "]";
}
}
输出结果:
Worker [name=tom, age=20, sex=男, salary=9000.0]
Worker [name=tom, age=20, sex=男, salary=9000.0]
当我们自定义输出规则后,就可以很方便的进行类属性的输出操作。
11.2.5 equals()方法
- public boolean equals(Object obj){}
- 默认实现为(this == obj),比较两个对象地址是否相同;
- 可进行覆盖,比较两个对象的内容是否相同;
public class TestMethodForEquals {
public static void main(String[] args) {
Student s1 = new Student("tom" , 20 , "male" , 99D);
// Student s2 = new Student("alex" , 22 , "male" , 100D);
// Student s3 = new Student("rose" , 19 , "famale" , 98D);
Student s4 = new Student("tom" , 20 , "male" , 99D);
//System.out.println(s1.equals(s1));
//System.out.println(s1.equals(s3));
//System.out.println(s1 == s2);
//System.out.println("-------------");
//字符串String类型equals == 结果上不一样,字符串对Object类中的原有方法进行了覆盖,比较内容
System.out.println(s1 == s4);//比较地址(因为地址内容不同,返回false)
System.out.println(s1.equals(s4));//比较内容(因为内容相同,所以返回true)
}
}
class Student{
String name;
int age;
String sex;
double score;
public Student(String name, int age, String sex, double score) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", score=" + score + "]";
}
@Override
public boolean equals(Object obj) {//比较内容
//比较两个对象的地址是否一样
if(this == obj) {
return true;
}
//确认对象不能为null
if(obj == null) {
return false;
}
//确认类型
if(obj.getClass() != obj.getClass()) {
return false;
}
//转型(转型的前提是类型必须是Student)
Student stu = (Student)obj;
//比较内容
if(this.name == stu.name && this.age == stu.age && this.sex == stu.sex && this.score == stu.score) {
return true;
}else {
return false;
}
}
}
输出结果:
false
true
同样,自定义equals方法后,可以灵活的进行类与类进行比较。