Java学习笔记18(Object类)

JAVA学习网 2018-01-10 18:13:02

Object类是Java中最顶层的父类,所有类都是它的子类,接口不继承它

Object类中的方法:

官方资料:boolean equals(Object obj)  指示其他某个对象是否与此对象“相等”

示例:

package demo;

public class Person extends Object {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 重写父类的equals方法
    // 源代码相同,equals是比较两个对象的内存地址

    public boolean equals(Object obj) {
        return this == obj;
    }

    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;
    }
}

 

package demo;

public class TestEquals {
    public static void main(String[] args) {
        //Person类继承了Object类,继承了父类的方法
        Person p1 = new Person("张三", 18);
        Person p2 = new Person("李四", 20);
        boolean b1 = p1.equals(p2);
        System.out.println(b1);//输出false
        p1 = p2;
        boolean b2 = p1.equals(p2);
        System.out.println(b2);//输出true
        
    }
}

 

不过发现比较内存地址是没有意义的,为了满足一些需求,我们可以重写下equals方法:

 

package demo;

public class Person extends Object {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 重写父类的equals方法,自己定义比较方式
    // 比较两个对象的age是否相同

    public boolean equals(Object obj) {
        // 处理传入的是本身的情况
        if (this == obj) {
            return true;
        }
        // 处理传入空的情况
        if (obj == null) {
            return false;
        }
        // 多态中不能调用子类的特性,所以需要向下转型
        // 加入instanceof为了防止风险,因为Object是顶层父类,防止传入其他的类
        if (obj instanceof Person) {
            Person p = (Person) obj;
            return this.age == p.age;
        } else {
            return false;
        }
    }

    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;
    }
}
package demo;

public class TestEquals {
    public static void main(String[] args) {
        //Person类继承了Object类,继承了父类的方法
        Person p1 = new Person("张三", 20);
        Person p2 = new Person("李四", 20);
        boolean b1 = p1.equals(p2);
        System.out.println(b1);//输出true
    }
}

 

toString方法:

官方资料:String toString() 返回该对象的字符串表示

继续上边的Person类写个示例:

package demo;

public class TestToString {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 18);
        String s1 = p1.toString();
        System.out.println(s1);
        System.out.println(p1);
    }
}
/*
这里两个输出相同:
demo.Person@2cdb03a1
demo.Person@2cdb03a1

所以我们发现,输入语句中如果写的是一个对象,默认调用对象的toString方法
*/

 

其实得到内存地址没有什么实际意义,为了满足一些需求,所以我们重写下toString方法:

package demo;

public class Person extends Object {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    //重写父类的toString方法
    public String toString(){
        return this.name+this.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;
    }
}
package demo;

public class TestToString {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 18);
        String s1 = p1.toString();
        System.out.println(s1);
        System.out.println(p1);
    }
}
/*
这里两个输出总是相同:
张三18
张三18

我们发现,输入语句中如果写的是一个对象,总是默认调用对象的toString方法
*/

 

Object还有其他方法,有些不常用,有些会在后边提到

 

阅读(774) 评论(0)