01 什么是多态
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示
多态性是对象多种表现形式的体现。
现实中中,说人喜欢娱乐
- 电子产品
- 电子竞技
- 追剧
- 运动
多态优点
-
消除类型之间的耦合关系
-
可替换性
-
可扩充性
-
接口性
-
灵活性
-
简化性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
多态的实现方式
方式一:重写与重载,Java 重写(Override)与重载(Overload)。
方式二:抽象类和抽象方法
方式三:接口,就是一些方法特征的集合,但没有方法的实现
生活中的接口:
- 在接口中的方法为抽象方法 不允许出现方法体
- 从java8开始允许接口中的方法有方法体 但必须使用default或修饰
- 在接口中 static 修饰的方法
- 只能使用接口名点方法名的方式调用不能使用实现类的实例化对象调用
- 不可以被子接口继承
- 在接口中 default 修饰的方法
- 只能使用实现类的实例化对象调用
- 可以子接口继承
- 可以被子接口重写
- 可以被实现类重写
package polymorphic01;
public class Animal {
public void eat(){
System.out.println("不吃不喝你是要升仙吗");
}
public static class Cat extends Animal{
@Override
public void eat() {
System.out.println("吃猫粮");
}
}
public static class Dog extends Animal{
@Override
public void eat() {
System.out.println("吃狗粮");
}
}
}
package Test.polymorphic01;
import polymorphic01.Animal;
import org.junit.jupiter.api.Test;
public class AnimalTest {
@Test
public void test(){
Animal cat = new Animal.Cat();
Animal dog = new Animal.Dog();
cat.eat();
dog.eat();
}
/*
吃猫粮
吃狗粮
*/
}
02 抽象类与子类
package polymorphic02;
/**
* 抽象方法 使用abstract修饰且没有方法体的方法我们称之为抽象方法
* 使用abstract修饰的类我们称之为抽象类
* 注意 具有抽象方法的类一定是抽象类但抽象类类不一定有抽象方法
* 子类继承父类 要么子类必须重写父类中的抽象方法 要么子类也是抽象类
* 抽象类不能被实例
*/
public abstract class Animal {
public abstract void eat();
public static class Cat extends Animal{
@Override
public void eat() {
System.out.println("吃猫粮");
}
}
public static class Dog extends Animal{
@Override
public void eat() {
System.out.println("吃狗粮");
}
}
public abstract static class Person extends Animal{
}
}
03 抽象类不能被实例化
package polymorphic03;
/**
* 抽象方法 使用abstract修饰且没有方法体的方法我们称之为抽象方法
* 使用abstract修饰的类我们称之为抽象类
* 注意 具有抽象方法的类一定是抽象类但抽象类类不一定有抽象方法
* 子类继承父类 要么子类必须重写父类中的抽象方法 要么子类也是抽象类
*/
public abstract class Animal {
public abstract void eat();
public static class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃猫粮");
}
}
public static class Dog extends Animal {
@Override
public void eat() {
System.out.println("吃狗粮");
}
}
}
package Test.polymorphic03;
import Day14.polymorphic03.Animal;
import org.junit.jupiter.api.Test;
public class AnimalTest {
@Test
public void test01(){
Animal cat = new Animal.Cat();
Animal dog = new Animal.Dog();
cat.eat();
dog.eat();
}
/*
吃猫粮
吃狗粮
*/
@Test
public void test(){
new Animal() {
@Override
public void eat() {
System.out.println("不吃不喝,你是要升仙吗");
}
}.eat();
}
//不吃不喝,你是要升仙吗
}
04 多态之接口
package polymorphic04;
public interface InterFace01 {
void if01Fun();
interface InterFace02 {
void if02Fun();
}
interface InterFace03 extends InterFace01, InterFace02 {
void if03Fun();
}
}
05 接口多继承与实现类
package polymorphic05;
public interface InterFace01 {
void if01Fun();
interface InterFace02 {
void if02Fun();
}
interface InterFace03 extends InterFace01, InterFace02 {
void if03Fun()