hello,进来的小伙伴们,你们好呐!✨
🎁🎁系列专栏【JavaSE】
🍰🍰本篇内容:JavaSE部分多态的知识详解,对准知识点阅读喔!
☕☕作者简介:一名大二即将升大三的科班小白,我很平凡,学会努力!
🍱🍱码云存放仓库gitee:https://gitee.com/king-zhou-of-java/java-se.githttps://gitee.com/king-zhou-of-java/java-se.git
一、多态的概念
🍣🍣多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。
🍇🍇例1:比如打印机的功能是打印文件,那么打印机又分为彩色打印机和黑白打印机。
二、多态实现条件
🍶1. 必须在继承体系下。
🍦2. 子类必须要对父类中方法进行重写。
🍺3. 通过父类的引用调用重写的方法。
🍲🍲实例:首先我们定义一个父类,这个Animal有两个成员变量,一个方法eat()。
class Animal{
public String name;
public int age;
public Animal(String name,int age){
this.age = age;
this.name = name;
}
public void eat(){
System.out.println(name+"正在吃东西");
}
}
🍠接下来我们定义两个子类Dog和Cat分别继承Animal,在这两个方法中重写eat()方法。
class Dog extends Animal{
public Dog(String name,int age){
super(name,age);
}
public void eat(){
System.out.println(name+"吃骨头");
}
public void bark(){
System.out.println(name+"汪汪汪~");
}
}
class Cat extends Animal{
public Cat(String name,int age) {
super(name,age);
}
public void eat(){
System.out.println(name+"吃鱼");
}
public void mew(){
System.out.println(name+"喵喵喵~");
}
}
🍏再次,我们在Test函数里面定义一个静态方法func(),参数是我们的父类Animal的引用,然后我们调用这个方法eat()。
public class Test1 {
public static void func(Animal animal){
animal.eat();
}
🍐最后我们实例化对象,初始化赋值。
public static void main(String[] args) {
Cat cat = new Cat("加菲猫",5);
Dog dog = new Dog("旺财",6);
}
🍱🍱那么,这个时候我们就会发现一个问题,当类的调用者在编写 eat 这个方法的时候, 参数类型为 Animal (父类), 此时在该方法内部并不知道, 也不关注当前的animal 引用指向的是哪个类型(哪个子类)的实例. 此时 animal这个引用调用 eat方法可能会有多种不同的表现(和animal 引用的实例相关), 这种行为就称为 多态。🍵🍵
三、 重写
一、概念
🍧🍧重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写。
二、方法重写的规则
🍏1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致。
🍧2.被重写的方法返回值类型可以不同,但是必须是具有父子关系的,比如我们将eat()方法定义成父子关系。
🍰3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected。
🍡 4.父类被static、private修饰的方法、构造方法都不能被重写。
🍊5.重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写。
🍑使用方法:1.鼠标右键,找到generate.
🍤2.选中红色箭头指向的部分。
🍾3.进来后点击我们要重写的方法。
🥞4.最后的结果就是这样。
🥯5.假如我们故意把重写的格式写错,这个注解可以很好的帮我们检测出来。