一、定义
1.理解
多态的定义很简单,多态多态就是同一个方法不同的行为。比如说我给你一张白纸(同一个方法),你选择不同的打印机(对象)会打印出不同的纸 比如黑白色 或者彩色(行为)。
2.条件
①向上转型
②重写同名方法
③父类引用调用子类对象的方法
二、向上转型
1.定义
向上转型就是将下面的子类对象给上面父类引用,就像这样。用代码所示
狗类(子类)
public class Dog extends Animal {
public String name;
public int age;
public Dog(String name, int age, String name1, int age1) {
super(name, age);
this.name = name1;
this.age = age1;
}
public Dog(String name, int age) {
super(name, age);
}
public void eat(){
System.out.println("正在吃狗粮");
}
public void wangwang(){
System.out.println("汪汪叫");
}
}
动物类(父类)
public class Animal {
public String name;
public int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("正在吃");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("小狗",10);//创造子类对象
Animal animal = dog;//子类对象给父类引用
}
}
将代码简写而来就是
public class Main {
public static void main(String[] args) {
Animal animal= new Dog("小狗",10);
}
}
所以我们能看出来前面的animal类就是父类引用 引用指向了子类对象dog。所以向上转型就是将父类引用指向了子类对象。
2.向上转型的理解⭐️
🌰
animal.eat可以调用
animal.wangwang却不能调用,因为wangwang方法不属于animal自己的类里面的方法。但是有一种方法可以访问到一一向上转型(也就是父类引用调用子类对象)。可以理解为“编译看左边,运行看右边。”
编译看左边,左边用父类引用,编译器会先看左边有没有这类父类引用,如果没有就会报错。
执行看右边,如果你重写了子类的方法,那么就会执行右边子类重写的方法。
2.三种向上转型的方式
下面有三种向上转型的方式
①直接引用
将父类引用引用给子类对象
Animal animal1 = new Dog("小狗",10);
②用方法传参的方式
将我的参数以父类的形式传出 再引用子类对象
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
fun1(dog);
}
public static void fun1(Animal animal){
}
}
③以返回值的形式传出
public class Main {
public static void main(String[] args) {
Animal animal = fun2();
}
public static Animal fun2(){
Dog dog = new Dog();
return dog;
//或者简写return new dog;
}
}
❗️以上这三种形式不用记,理解了也自然知道了。
三、再谈重写
重写:是对一个方法体进行重新书写,其返回值,方法名,参数形式都一致。
❓为什么要进行方法的重写
⭐️因为当向上转型时,用父类引用引用了子类对象,所以会编译看左是否能通过,运行看右是否能执行,这里的执行就是看有没有子类重写父类方法,执行子类重写方法。
⚠️重写注意事项
①private和final修饰的方法不能被重写
🍎final修饰的变量都是常量,是不可修改和改变的,对于方法也一样。private修饰的方法也不可修改。
②被static修饰的方法
③构造方法不能进行重写
④重写的方法不能大于父类的修饰权限
private< default <protect <public
⑤构造方法不能进行重写