java多态

面向对象的三大特点是封装、继承、多态,其中extends类和implements接口是多态的基础,所谓多态,是对一个对象而言的,例如有一个父类叫动物,子类叫狗,那么我创建一个对象“Dog juanjuan = new Dog()”时,juanjuan这个对象既是狗也是一个动物,怎么叫都没有问题。多态还有一种常用写法即“父类名称 对象名 = new 子类名称()”,那么这样写有什么需要注意的呢?

//父类
public class Father{
    int age = 50;
    public void eat(){
        sout("父亲喜欢吃花生");
    }

    public void earn(){
        sout("父亲挣钱");
    }
}
//子类
public class Son extends Father{
    int age = 26;

    @Override
    public void eat(){
        sout("儿子喜欢吃肉");
    }

    public void study(){
        sout("儿子学习");
    }
}
public class Main{
    psvm{
    Father jack = new Son();
    sout(jack.age);  //50
    jack.eat();      //儿子喜欢吃肉
    jack.earn();     //父亲挣钱
    jack.study();    //找不到该方法,编译错误
    }
}

我们在创建对象的时候就看这个对象是什么类型的,比如Jack是Father类型的,那么它拥有Father的全部成员变量和成员方法,因为成员变量是不能重载的,所以jack.age会输出50;那么new Son()有什么作用呢?那就是如果方法进行了重载,那么就会优先执行重载的方法。
个人理解如下,如有错误,万分抱歉!


image.png

个人理解是,在创建Father类型的对象,但右边new了一个子类的时候,由于成员变量无法重载,所以直接将Father类中的成员变量照搬过来即可,但是对成员方法要在Son()中进行检查,如有同名重写的方法,就用Son()中的方法,其它的方法直接照搬Father类中的方法。

所以关键是看这个对象是什么类型的,要记住jack是Father类型的,但是new Son()就是对一些重名函数进行重写。

个人理解这样的做法是,比如我创建了某个用户,我就想把他当做User来看,User xiezhao,但是在某些权限方面,可能是VIP或者不是VIP,User xiezhao = new Vip();/User xiezhao = new NonVip();首先我肯定是用户,但对于是不是VIP,我有不同的权限,这样就可以很统一的把一些成员当做User用户来看,而不是细分到是不是VIP。换言之,在代码层面来看,我可以把左边进行统一,而右边表示的是我所关注的点,如下所示

//不使用多态
Vip1 a1 = new vip1();
Vip2 a2 = new vip2();
Vip1 a3 = new vip1();
Vip1 a4 = new vip1();
Vip3 a5 = new vip3();

//使用多态
User a1 = new vip1();
User a2 = new vip2();
User a3 = new vip1();
User a4 = new vip1();
User a5 = new vip3();

看出来了吗,我并不关心其它的东西,我只关心你是Vip几,反正你是我的用户就完事儿了,代码左边直接统一起来了,巴适!

总结下来就是,我等号左边是什么类型,就把这个对象当做是什么类型的来看,但是跟普通的实例化有一点区别就是,如果在子类中有父类同名方法进行了重载,那么我用的这个同名方法就要变更为子类中的方法,其它的一切一切都不变!

你可能感兴趣的:(java多态)