Javase学习-04类的重写

JavaseLearn04-类的重写

1. 思考问题:

在以后敲代码的过程中,常常会需要比较两个对象的值,那么该如何实现呢?

/**
 * @author: TSCCG
 * @date: 2021/4/25
 */
public class Sson {
    private String age;
    public Sson(String age) {
        this.age = age;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
    /**
    *程序入口
    */
    public static void main(String[] args) {
        Sson sson1 = new Sson("30");
        Sson sson2 = new Sson("30");
        System.out.println("结果1:" + (sson1 == sson2));
        System.out.println("结果2:" + (sson1.equals(sson2)));
    }
}

运行结果:

结果1:false
结果2:false

为什么会出现上述结果?

结果1:

​ 当使用Sson类创建一个对象时,会在堆中加载一块内存空间存储数据并指向这块内存,每创建一个对象就加载一块新的内存空间,创建的对象就指向一个新的地址。如下图所示:

结果1进行" == "比较时,比较的是两个引用,而引用存储的是两个对象在堆内存中的地址,故结果为false.

结果2:

子类可以调用父类中非私有的方法,顶级父类Object中equals方法的代码为:

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

而Sson类并未重写equals方法,所以和结果1一致,为false

2. 如何比较两个对象?

父类方法无法满足子类需求,那么就在子类中重写该方法:

public class Sson {
    private int age;
    public Ffather(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    /**
     * 重写equals方法,使Sson对象可以比较值
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) { //对象会以Object类型传过来
        Sson sson;
        if(obj instanceof Sson) { //判断传入的obj是否是Sson类型
            sson = (Sson)obj; //强转回Sson类型
            if(this.getAge().equals(sson.getAge()) ){ //比较对象的值
                return true;
            }

        }
        return false;
    }
    /**
    *程序入口
    */
    public static void main(String[] args) {
        Sson sson1 = new Sson("30");
        Sson sson2 = new Sson("30");
        System.out.println("结果1:" + (sson1 == sson2));
        System.out.println("结果2:" + (sson1.equals(sson2)));
    }
}

运行结果:

结果1:false
结果2:true

3. 重写toString

toString方法是Object类里的方法,作用是返回对象的字符串表示形式。

我们看下面例子:

先创建一个Name类,然后创建一个Name对象,赋值为"张三"。

接着输出两次:

  • 第一次:直接输出该对象的引用name
  • 第二次:通过name调用toString()方法后输出
/**
 * @Author: TSCCG
 * @Date: 2021/07/02 20:01
 */
public class ToDemo01 {
    public static void main(String[] args) {
        Name name = new Name("张三");
        System.out.println(name);
        System.out.println(name.toString());
        /*
          public String toString() {
                  return getClass().getName() + "@" + Integer.toHexString(hashCode());
              }
         */
    }
}
class Name {
    private String name;

    public Name(String  name) {
        this.name = name;
    }
}

结果:

Name@28d93b30
Name@28d93b30

由结果可见,直接输出对象引用和通过name调用toString方法后再输出的结果是一样的。

这说明在直接输出对象引用时会自动调用toString方法。

而我们现在想把"张三"打印出来,就必须重写Object类中的toString方法:

/**
 * @Author: TSCCG
 * @Date: 2021/07/02 20:01
 */
public class ToDemo01 {
    public static void main(String[] args) {
        Name name = new Name("张三");
        System.out.println(name);
        System.out.println(name.toString());
    }
}
class Name {
    private String name;

    public Name(String  name) {
        this.name = name;
    }

    /**
    * 该方法返回值为String类型,当name为其他类型的元素时,需要将一段字符串与name拼接起来
    * 如:return name + " ";
    */
    @Override
    public String toString() {
        return name;
    }
}

结果:

张三
张三

4. 总结:

当父类中的方法无法满足子类需求时,就要重写父类的方法

posted @ 2021-04-26 21:44  TSCCG  阅读(57)  评论(0编辑  收藏  举报