什么是toString()?
返回该对象的字符串表示,当程序使用 System.out.printlnO方法输出一个对象, 或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的 toString串表示。 Object 类的 toStringO方法返回"运行时类名@十六进制 hashCode 值"格式的字 符串,但很多类都重写了 Object 类的 toStringO方法,用于返回可以表述该对象信息的字符串 。
为什么很多时候还要重写toString()?
首先Object 类的 toStringO方法返回"运行时类名@十六进制 hashCode 值"格式的字 符串,显然很多时候无法满足用户的需求了。
如何使用toString()?
实例代码:
/**
* @author Jason
* @create 2020-04-27 11:08
*/
public class ObjectTest01 {
public static void main(String[] args) {
MyTime myTime = new MyTime(1970,01,01);
String s = myTime.toString();
System.out.println(s);
System.out.println(myTime);
}
}
class MyTime{
int year;
int month;
int day;
public MyTime() {
}
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public String toString(){
return this.year+"年"+this.month+"月"+this.day+"日";
}
}
equals和==
==比较的是什么?
等号可以比较基本类型和引用类型,等号比较的是值,特别是比较引用类型,比较的是引用的内存地址。
/**
* @author Jason
* @create 2020-04-27 14:24
* 等号
*/
public class EqualsTest01 {
public static void main(String[] args) {
int a =10;
int b =10;
System.out.println((a==b)?"a==b":"a!=b");
Person p1 = new Person();
p1.id = 1111;
p1.name = "Jason";
Person p2 = new Person();
p2.id = 2222;
p2.name = "Rose";
System.out.println((p1==p2)?"p1==p2":"p1!=p2");
//p1和p3指向的同一个对象,所有地址是相等的。所有这里就是相等的
Person p3 = p1;
System.out.println((p1==p3)?"p1==p3":"p1!=p3");
String s1 = "abc";
String s2 = "abc";
System.out.println((s1==s2)?"s1==s2":"s1!=s2");
}
}
/**
* @author Jason
* @create 2020-04-27 14:26
*/
public class Person {
int id;
String name;
}
equals比较的是什么?
Object 的 equals 方法默认比较的就是地址,Object 的equals 方法代码 如下:
public boolean equals(Object obj) {
return (this == obj);
}
显然这样的比较是不能满足我们的要求的
如果不准备调用父类的 equals 方法,那么必须覆盖父类的 equals 方法 行为
/**
* @author Jason
* @create 2020-04-27 14:49
* equals
*/
public class EqualsTest02 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2)?"s1等于s2":"s1不等于s2");
String s3 = new String("abc");
String s4 = new String ("abc");
System.out.println(s3.equals(s4)?"s3等于s4":"s3不等于s4");
//这里p1不等于p2,因为它默认调用的是object的equals方法
//object比较的是equals方法默认比较的是地址
Person p1 = new Person();
p1.id = 1111;
p1.name = "Jason";
Person p2 = new Person();
p2.id = 1111;
p2.name = "Jason";
System.out.println(p1.equals(p2)?"p1等于p2":"p1不等于p2");
//如果我们不想按照父类的方法进行比较,那我们应该怎么办呢?——覆盖父类的equals方法
}
}
/**
* @author Jason
* @create 2020-04-27 14:55
* 重写equals
*/
public class Person {
int id;
String name;
public boolean equals(Object obj){
if (this == obj){
return true;
}
if (obj instanceof Person){
Person p = (Person)obj;
if (this.id==p.id){
return true;
}
}
return false;
}
}
总结:
java中基本数据类用==判断是否相等,引用数据类型用equals判断是否相等。
综合实例代码:
/**
* @author Jason
* @create 2020-04-27 15:35
*/
public class EqualsTest03 {
public static void main(String[] args) {
Student s1 = new Student(111,"北京市人大附中");
Student s2 = new Student(111,"北京市人大附中");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
/**
* @author Jason
* @create 2020-04-27 15:35
*/
public class Student {
int no;
String school;
public Student() {
}
public Student(int no, String school) {
this.no = no;
this.school = school;
}
public String toString (){
return "学号:"+no+",所在学校:"+school;
}
public boolean equals(Object obj){
if (obj==null || !(obj instanceof Student)){
return false;
}if (this == obj){
return true;
}
Student s = (Student)obj;
return this.no == s.no && this.school.equals(s.school);
}
}