Object
概念:
Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类,换句话说,该类所具备的方法,所有类都会有一份
toString:
作用:
以良好的格式,更方便的展示对象中的属性值
重写toString方法的方式可以打印属性值,否则就是继承Object的方法,打印的是内存地址
在类的空白区域,右键 -> Generate -> 选择toString
代码演示:
package api.obj;
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name, int age) {
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 String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
/**
equals也是需要重写的否则就算是调用也是用的object的equals,在源码里object的equals是用的==,
所以比较的还是内存地址,要想比较属性值就要重写
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Demo01 {
public static void main(String[] args) {
Student s1 = new Student("bbb",11);
Student s2 = new Student("bbb",11);
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
/**
直接打印对象控制台是打印的地址值:day13.Student@4c203ea1
通过源码跟进看到,println调用了valueOf,valueOf调用了toString方法,获取包名+类名+@+地址值
然后再返回给println方法
public String toString () {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Student没有写toString方法,但是所有的类都默认继承了Object类,所以可以使用Object的toStrinig方法
但是拿到这个地址值没什么卵用,所以这里就涉及到了重写,放父类的方法不能满足子类时,就可以重写该方法,在
子类有该方法后,调用时会采用就近原则使用子类的,而不去调用Object的toString方法,重新以后就不是地址值
了,就是打印的属性值
*/
System.out.println(s1);
}
}
equals:
作用:
用于对象之间的比较,返回true和false的结果
重写equals方法的场景
不希望比较对象的地址值,想要结合对象属性进行比较的时候。
代码演示:
public static void main(String[] args) {
String s1 = "abc";
StringBuilder sb = new StringBuilder("abc");
//1.此时调用的是String类中的equals方法,String类重写了toString,但源码会判断是不是一个字符串类型,不是的话直接返回false
System.out.println(s1.equals(sb)); // false
//StringBuilder类中是没有重写equals方法,用的就是Object类中的==
System.out.println(sb.equals(s1)); // false
}
Objects:
概念:
用于操作对象或在操作前检查某些条件,可以处理一些空值
常用方法:
方法名 |
说明 |
public static String toString(对象) |
返回参数中对象的字符串表示形式。 |
public static String toString(对象, 默认字符串) |
返回对象的字符串表示形式。 |
public static Boolean isNull(对象) |
判断对象是否为空 |
public static Boolean nonNull(对象) |
判断对象是否不为空 |
代码演示:
public static void main(String[] args) {
// public static String toString(对象): 返回参数中对象的字符串表示形式。
// 调用的是对象的toString,如果对象中没有就调用object
Student s = new Student("itzhuzhu", 23);
String result = Objects.toString(s);
System.out.println(result);
// public static String toString(对象, 默认字符串): 返回对象的字符串表示形式。如果对象为空,那么返回第二个参数.
Student s2 = new Student("itzhuzhu", 23);
Student s3 = null;
String result2 = Objects.toString(s3, "随便写一个");
System.out.println(result2);
// public static Boolean isNull(对象): 判断对象是否为空
Student s4 = null;
Student s5 = new Student();
System.out.println(Objects.isNull(s4)); // true
System.out.println(Objects.isNull(s5)); // false
// public static Boolean nonNull(对象): 判断对象是否不为空
Student s6 = new Student();
Student s7 = null;
System.out.println(Objects.nonNull(s6));// tru
System.out.println(Objects.nonNull(s7));// false
}