Object类在JDK1.0便存在,类层次结构的根类,每个类都使用 Object 作为超类
因为可作为所有类的父类,在设计时考虑所有子类继承的问题——默认调用父类无参构造函数,所以该类提供无参构造方法,所有的没有显式继承父类的类会默认继承Object类 调用Object的无参构造方法,所以不会出现构造方法调用失败的语法错误
class Person{ public Person{系统默认super.Object();}}//相当于class Person extends Object{}
既然Object类是所有类的父类,那么可以用它接受所有类实例 包括数组
class Person{}
public class JavaDemo{
public static void main(String args[]){
Object obj=new Person();//Object类对象向上转型
if(obj instanceof Person){
Person per=(Person)obj;//Person类对象向下转型
}
}
}
public class JavaDemo{
public static void main(String args[]){
Object obj=new int[]{1,2,3};//Object类对象向上转型
if(obj instanceof Person){
int[] data=(int [])obj;//Person类对象向下转型
for(int temp:data){
System.out.print(temp+",")}
}
}
}
Object类特点:解决参数统一问题,也就是说Object类可以接受所有数据特征
Object类提供了一些处理方法
获取对象完整信息toString()
class Person{}
public class JavaDemo{
public static void main(){
Person per=new Person();
System.out.println(per);//输出一个地址
System.out.println(per.toString());//继承Object的方法,输出同一个地址
}
}
即输出对象时默认调用toString方法,对于对象信息的获取我们可以直接覆写此方法
class Person{
private String name;
private int age;
public person(String name ,int age){
this.name=name;
this.age=age;
}
@Override
public String toString(){
return "姓名"+this.name+"年龄"+this.age;
}
}
public class JavaDemo{
public static void main(String[] args){
Person per=new Person("张三",20);
System.out.println(per);//输出姓名张三年龄20
System.out.println(per.toString());//输出姓名张三年龄20
}
}
对象比较: equals():比较两个对象是否完全一样,两个对象地址是不同的 即比较的是对象内容
class Person{
private String name;
private int age;
public person(String name ,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名"+this.name+"年龄"+this.age;
}
public String getName(){
return this.name
}
public int getAge(){
return this.age;
}
}
public class JavaDemo{
public static void main(String[] args){
Person perA=new Person("张三",20);
Person perB=new Person("张三",20);
if(perA.getName().equals(perB.getName())&&perA.getAge()==perB.getAge()){
}else{
}
}
}
上面需要对每一个属性进行判断需要在外部调用大量get方法,对象比较应该是一个类内部具有的功能,而不应该在外部定义
Object类为所有类的父类提供了对象比较操作的支持,equals()
对象比较:
默认情况下只是进行地址判断,如果要正确实现判断处理 需要在子类中覆写
class Person{
private String name;
private int age;
public Person(String name ,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名"+this.name+"年龄"+this.age;
}
//对equals()方法覆写
public boolean equals(Object obj){//2个对象,1个是Person类对象调用本方法的this对象,1个是调用时传入的Object对象 再向下转型获取子类对象特有属性
if(!(obj instanceof Person)){
return false;//只能比较同类型
}
if(obj==null){
return false;//b不关心null的比较
}
if(this==obj){
return true;//同一个地址直接返回就可
}
Person per=(Person) obj;//向下转型获取类中的属性
return this.name.equals(per.name)&&this.age==per.age;
}
}
public class JavaDemo{
public static void main(String[] args){
Person perA=new Person("张三",20);
Person perB=new Person("张三",20);
System.out.println(perA.equals(perB));
System.out.println(perA.equals("狗"));//String类 但无法转型成Person
}
}
String类是Object类子类,同样也
覆写了equals()方法