- 超类、基类,是所有类的直接或者间接父类,位于继承树的最顶层
- 任何类,如果没有书写extends显示地继承某个类,都默认直接继承了Object类,否则为间接继承
- Object类中所定义的方法,是所有对象都具备的方法
- Object类型可以存储任何对象
- 作为参数,可以接受任何对象
- 作为返回值,可以返回任何对象
public final Class<?> getClass(){}
返回引用中存储的实际对象类型。
应用:通常用于判断两个引用中实际存储对象类型是否一致。
案例:
//Person类 public class Person { private String name; //构造方法 public Person(String name) { this.name = name; } }
//Card类 public class Card { private int count; //构造方法 public Card(int count) { this.count = count; } }
public class Demo { public static void main(String[] args) { //先创建两个同类对象 Person test1 = new Person("张三"); Person test2 = new Person("李四"); //用getClass()方法返回对象的类 Class class1 = test1.getClass(); Class class2 = test2.getClass(); //判断两个对象是不是同一个类 if (class1==class2) { System.out.println("同类!"); }else { System.out.println("不同类!"); } //创建另外一个类的对象测试 Card test3 = new Card(1); Class class3 = test3.getClass(); //结果证明test1与test3并不属于同一个类 - 测试结果正确 if (class1==class3) { System.out.println("同类!"); }else { System.out.println("不同类!"); } } }
结果为:
同类!
不同类!
public int hashCode(){}
返回该对象的哈希码值。
哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值。
一般情况下同一个对象返回相同哈希码。
案例:
public class HashCode { public static void main(String[] args) { String str1 = "1"; String str2 = "2"; String str3 = str2; //利用hashCode方法打印这三个对象的哈希值 System.out.println(str1.hashCode()); System.out.println(str2.hashCode()); System.out.println(str3.hashCode()); } }
结果中,str2与str3的结果相同。
public String toString(){}
返回该对象的字符串表示(表现形式)。
可以根据程序需求覆盖该放阿飞,如:展示对象各个属性值。
案例:
public class ToString { public static void main(String[] args) { ToString test = new ToString(); System.out.println(test.toString()); } }
一般会根据自己的情况重写toString()方法,以满足当下的需求
public boolean equals(Object obj){}
默认实现为(this == obj),比较两个对象地址是否相同
可以进行覆盖,比较两个对象的内容是否相同
案例:
//用Person和Card两个类进行分析 class Person{ private String name; private int age; //构造函数 public Person(String name, int age) { this.name = name; this.age = age; } } class Card{ private int count; public Card(int count) { this.count = count; } }
public class Equals { public static void main(String[] args) { //这里分别有test1/2/3/4四个对象,分别进行比较 Person test1 = new Person("张三", 24); Card test2 = new Card(10); Person test3 = test1; Person test4 = new Person("张三", 24); //test1与test2 - 很明显属于两个不同的类 System.out.println(test1.equals(test2)); //test1与test3 - 看起来是两个不同的对象,实际上由于直接将test1赋值给了test3,所以他们的地址是相同的 System.out.println(test1.equals(test3)); //test1与test4 - 对象的属性都相同,但由于是分别new出来的,所以只是属性相同,地址不同 System.out.println(test1.equals(test4)); } }
结果为:
false
true
false
如果希望test1与test4这种情况为true应该怎么做?
需要将方法重写,进行覆盖,从而比较两个对象的内容是否相同,步骤如下:
在Person类中添加一部分代码:
class Person{ private String name; private int age; //构造函数 public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } //重写equals方法 - 实现需求 @Override public boolean equals(Object obj) { //1.比较两个引用是否指向同一个对象 if(this == obj){ return true; } //2.判断obj是否为null if(obj == null){ return false; } //3.判断两个引用指向的实际对象类型是否一致 if(obj instanceof Person){ //4.强制类型转换 Person p = (Person) obj; //5.依次比较各个属性值是否相同 if(this.name.equals(p.getName()) && this.age == p.getAge()){ return true; } } return false; } }
Person类修改后,结果为:
false
true
true
知识点总结自bilibili(Java学习营)视频地址