Java 多态
多态简单引入
如果你看上面的引入感觉一脸懵逼,baby这是正常的,下面让我来为你讲解,在讲解之前作者了解了一部分Idea的快捷键,现为大家分享一下,节约大家敲代码的时间。
IDEA常用快📕敲代码的快捷键
快速补全代码 |
| |
快速生成含有任意形参的构造器和私有属性的Getter/Setter 等方法 |
| |
快速显示类结构,可以显示类中包含的所有属性和方法 |
| |
快速提示完成,在代码存在语法问题时,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上面直接复制粘贴,然后就能运行
运行结果
总结
多态,在作者看来是连接父类与子类的方式,以父类型作为参数,接收子类,大大提高了开发的速度与便捷性。本文有点肝了,消耗了作者很多心血,因为作者准备进入面向对象的接口(那是作者目前觉得最重要的一章),所以在前面就不过多停留了,如果文章出现错误或者你有不懂的地方欢迎来与作者讨论。