java 多态(一)

多态:父类引用指向子类引用。(如果父类是Object,其实指向的是子类对象中的object)

代码块

public class Test {
    public static void main(String[] args) {
        Person p1 = new Person(1,"S");
        Person p2 = new Person(1,"S");
        System.out.println(p1.equals(p2));
    }
}

class Person{
    int id;
    String name;

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

    public boolean equals(Object obj){
        Person p = (Person)obj;
        if (id == p.id)return true;
        return false;
    }   
}
详解:
关于内存存在情况:

这里写图片描述

代码解释:

代码解释1. public boolean equals(Object obj)

参数obj指向的是P2中的obj,因为main函数中p1.equals(p2),传入的是p2这个对象,尽管传入的是p2对象,但是obj指向的是p2内部的obj

验证这一点也可以通过调用obj的方法来验证,如图:
这里写图片描述

可以看出此obj对象可以使用的方法只有来自Object类的。

代码解释2. Person p = (Person)obj;

当强制类型转换后,p不再指向p2中的obj,而是指向Person这个类。

验证这一点也可以通过调用obj的方法来验证,如图:
这里写图片描述

可以看出此p对象可以使用的方法不仅有来自Object类的,还有Person类的方法于属性。

优化代码:

        if (id == p.id)return true;
        return false;

此段代码等同于

return this.id == p.id;

可能这段代码刚开始不理解,但是如果换种思维就明白了。参看以下代码:

public class TestString {
    public static void main(String[] args) {
        int num1 = 2;
        int num2 = 2;
        System.out.println(num1 == num2);

        int num3 = 3;
        System.out.println(num1 == num3);
    }
}

运行结果:
true
false

因为返回值是int类型,所以可以直接 return this.id == p.id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值