Object类
在Java.lang包中,类Object是类层次结构当中的根类。
,每一个类像Person、Peolple、Student、Animal…都是Object类的子类,所有的对象(包括数组)都实现类Object的子类。
创建学生标准类
public class Student{
private String name ;
private int age;
public String getNmae(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public Student(){
}
public Student(String name ,int age){
super();
this.name=name;
this.age=age;
}
//想要查看对象中的信息,需要重写toString方法
@Override
public String toString(){
return "Student[name="+name+",age="+age+"]";
}
}
public class Demo01object {
public static void main(String[] args) {
// ctrl+1 回车 快速获取返回值
Student student = new Student("张三",20);
System.out.println(student);
//com.zhiyou100.api.object.Student@bd916 逻辑地址值
//当重写之后,系统会认为你要查看的是该对象的成员信息,必然调用的是toString()方法
// toString 不可改变,否则认为是别的方法
System.out.println(student.toString());
//Student [name=张三, age=20]
Student student1 = new Student("小王",20);
Student student2 = new Student("小王",20);
//让s1和s2作比较
boolean result= student1.equals(student2);
if(result) {
System.out.println("s1和s2是同一个对象");
System.out.println(student1.hashCode());
System.out.println(student2.hashCode());
}else {
System.out.println("s1和s2不是同一个对象");
}
// s1和s2是同一个对象
}
Object类中的equals方法,默认比较的是两个对象的地址值,没什么意义。所以我们需要重写equals方法,比较两个对象的成员信息(name,age)
但是伴随着问题的出现
隐含着一个多态,弊端是无法使用子类独有的内容。需要向下转型,有可能转型失败,抛出异常。解决办法:使用instanceof做类型判断
@Override
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(this == obj){
return true;
}
// 比较的是方法的调用者和方法的参数对象
// == 此时比较的是地址
if(obj instranceof Student){
Student student=(Student) obj;
// 比较两个对象的成员变量值是否相等
boolean result = this.name.equals(student.getName()) && this.age==student.getAge();
return result;
}
//如果obj不属于Student类型,直接return false
return false
}