1.Object类:
java.lang.Object类是Java语言中的根,即所有类的父类
如果一个类没有指定继承或者没有指定父类,那么默认则继承自Object类
2.toString方法
public String toString():返回该对象的字符串表示
特点:
1.toString方法返回的字符串内容格式:类的全路径@十六进制数的地址值
2.直接打印对象名,其实就是打印对象调用toString方法返回的字符串内容
问题:
如果打印对象的时候,不希望打印的时地址值这种形式的字符串,那么应该怎么做?
解决:
重写toString方法--->可以自定义返回的字符串内容格式,也可以使用快捷键生成默认的格式(alt+insert)
public class Person {
String name;
int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Tests {
public static void main(String[] args) {
Person person = new Person("张三",18);
System.out.println(person);
System.out.println(person.toString());
}
}
3.equals方法:
public boolean equals(Object ob):指示其他某个对象是否与此对象“相等”
源码:
public boolean equals(Object obj) {
return (this == obj);
}
特点:
1.Object类的equals方法默认比较的时两个对象的地址值是否相等(==)
2.由于Java中所有类都是继承Object类,所以如果类中没有重写equals方法,默认就是地址值比较
3.如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以重写equals方法
import java.util.Objects;
public class Person {
String name;
int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//快捷键重写的equals方法
@Override
public boolean equals(Object o) {
// 如果两个对象的地址值相同,就直接返回true,结束方法
if (this == o) return true;
// 如果传入的对象为null,就直接返回false,结束方法
// 如果两个对象的类型不一致,就直接返回false,结束方法
if (o == null || getClass() != o.getClass()) return false;
// 来到这里,说明两个对象地址值不同,并且一定是Person类型
Person person = (Person) o; // 多态,向下转型
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Tests {
public static void main(String[] args) {
Person p1 = new Person("张三",29);
Person p2 = new Person("张三",29);
// 在开发中,往往认为p1和p2是两个相同的对象因为属性值相同
System.out.println(p1==p2);
System.out.println(p1.equals(p2));
}
}
4.JDK7提供的一个Objects工具类
提供了一些方法来操作对象,由一些静态的实用方法组成
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题
源码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
扩展知识点:
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
上述代码是Object类的源码,这个没有方法体的方法是native方法,native修饰的方法成为【本地方法】
这种方法是没有方法体的,我们查看不了它的实现,所以我们不需要关系方法如何实现
什么时候会使用?
- 当需要访问C或者C++的代码时,或者访问操作系统的底层类库时,可以使用本地方法实现,也意味着Java可以和其他编程语言进行交互
- 本地方法的作用:就是当Java调用非Java代码的接口时,可以使用本地方法,方法的实现由非java语言实现
String name1 = null;
String name2 = new String("张三");
String name3 = "null";
System.out.println(name1);
System.out.println(name2);
// 比较name1和name2字符串内容是否相同
//System.out.println(name1.equals(name2));
System.out.println(Objects.equals(name1,name3));