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

运行结果:

结果1false
结果2false

为什么会出现上述结果?

结果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)));
    }
}

运行结果:

结果1false
结果2true

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. 总结:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TSCCG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值