Java面向对象之多态

面向对象三大特征:封装,继承,多态

三大特征都很重要,联系紧密,现在来学习一下三大特征之多态

概念:

官方概念:编译时跟运行时类型不一致就产生了多态

民间理解:父类类型的变量,存放子类类型的对象,可能存放子类类型的对象有多种可能

使用多态的前提:必须存在继承关系

多态的编译过程:

编译时:

看左边,看父类类型,会到父类类型里面去找对应的属性,

如果没有找到,会想更高的父类类型去找,如果找到编译通过

如果找不到编译错误

运行时:

先在子类找,如果子类没有找到,去父类找,直到找到为止

注意:

如果父类中没有此方法,子类中存在,但是编译不会通过

因为编译是先从父类寻找,运行时才从子类开始寻找

编译时运行细节:

多态编译时和运行时的细节:

​ 实例方法:

​ 父类中有一个方法,子类覆写了 :

​ 编译通过,运行的是子类的方法

​ 父类中有一个方法,子类没有:

​ 编译通过,运行的是父类的方法

​ 父类中没有,子类有一个方法:

​ 编译失败

​ 父类子类都没有:

​ …都没有还运行个屁啊…

​ 静态方法:

​ 父类中静态方法:

​ 子类无法覆写父类用static修饰的方法

​ 字段没有覆写一说

参数传递特点:

多态在传递参数时的特点:

​ 可以将多个子类的类型在父类方法中进行覆盖

​ 父类类型的变量存放子类类型的对象

​ 还挺有意思的

多态Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class DuoTaiDemo {
public static void main(String [] args){
//java的多态性,这里可以用AnimalTest类型来定义AnimalTestS的对象
AnimalTest anst = new AnimalTestS();
anst.speak(); //调用anst对象的speak方法
System.out.println("测试测试测试");
}

}
class Test{

}
class AnimalTest extends Test{ //继承Test类
String name = "月球";
void speak(){ //定义speak方法
System.out.println("跟得上我的速度吗?弟弟");
}
}
class AnimalTestS extends AnimalTest{
void speak(){ //覆写父类的方法
System.out.println("你太慢了!弟弟");
}
String name = "土星";
}
❤赏点钱让我买杯快乐水8❤