Java 多态

多态简单引入

如果你看上面的引入感觉一脸懵逼,baby这是正常的,下面让我来为你讲解,在讲解之前作者了解了一部分Idea的快捷键,现为大家分享一下,节约大家敲代码的时间。

IDEA常用快📕敲代码的快捷键

IDEA敲代码的快捷键
快速补全代码
Alt + /
快速生成含有任意形参的构造器和私有属性Getter/Setter等方法
Alt + Insert
快速显示类结构,可以显示类中包含的所有属性和方法
Alt + 7
快速提示完成,在代码存在语法问题时,IDEA 会提示使用该快捷键自动修正语法
(功能非常强大,最常使用)
Alt + Enter

本文主要用到快速生成含任意形参的构造器与私有属性的Getter/Setter方法

🆗,下面我来正式介绍多态。

简单定义

在 Java 中,面向对象的多态是指允许不同的对象对同一消息作出响应,即同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

还是不好理解,那我们看截图

多态主要分为运行时多态和编译时多态,本文重点介绍运行时多态。

运行时多态

变量运行特点

乍看上面图片,可谓是一脸懵逼,因为作者当时就是这种感受。

所以作者为大家准备了代码讲解

先看变量调用(两个“左”):

两个“左”:
编译看左边:Java 编译代码的时候,会看左边的父类中有没有这个变量。有,则编译成功,没有则失败
运行看左边:Java运行代码的时候,实际获取的是左边成员变量的值

上述很明显,对于:

Animal a = new Dog;

 运行结果:

 运行结果是 动物,和左边父类变量值一样。


下面看成员方法调用中的一“左”,一”右“。 (如果你理解了变量的两“左",这个和那个类似,很好理解)

一“左”,一“右”
编译看左边:java编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,反之失败
运行看右边:java运行代码的时候,实际上运行的是子类中的方法

比如上面代码:

a.show();

结果是 Dog,运行的是右边子类的方法。

多态前提

继承关系的表现:

成员变量:在子类的对象中,会把父类的成员变量也继承下来(例如 父:name,子:name)

方法重写:

成员方法:如果子类对方法进行了重写,那么在虚方法表中会把父类方法进行覆盖哦

补充:虚方法表介绍(非private,final,static的方法)

多态的优缺点

 优点

缺点

解释:因为在多态中,如果子类特有的,父类没有,那么在运用时就会报错 ,所以不能使用子类的特有功能。

但是,这是有解决方法的:将原本准备用多态的父类类型转换为子类类型

作者关于多态的自己代码

Main函数

public class Main {
    public static void main(String[] args) {
        Person li = new gouso();
        li.setAge(10);
        li.setName("fish");

        sogou xin = new sogou();
        xin.setAge(30);
        xin.setName("jijiao");

        gouso ji =new gouso();
        ji.setAge(20);
        ji.setName("jinitaimei");

        register(xin);
        register(ji);
        register(li);

    }


    public static void register(Person p){
        p.show();
       p.know();
    }
}

 父类

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

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = 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;
    }
    public void  show (){
        System.out.println(name+","+age);
    }

    public void know() {
        System.out.println(name+","+age);
    }
}

子类

public class sogou extends Person {
    public void show(){
        System.out.println("学生信息为   "+getName()+"jinitaimei"+getAge());
    }
    public void know(){
        System.out.println("我看过"+getName()+"    ,但这是"+getAge()+"年前的事情了");
    }

}
public class gouso extends Person {
    public void show(){
        System.out.println("鸡的信息  "+getName()+"oh baby"+getAge());
    }
}
上面是作者自己的代码,大家可以拿去在idea上面直接复制粘贴,然后就能运行

运行结果

总结

多态,在作者看来是连接父类与子类的方式,以父类型作为参数,接收子类,大大提高了开发的速度与便捷性。本文有点肝了,消耗了作者很多心血,因为作者准备进入面向对象的接口(那是作者目前觉得最重要的一章),所以在前面就不过多停留了,如果文章出现错误或者你有不懂的地方欢迎来与作者讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值