Java笔记--多态
一、多态介绍
同一个行为具有多个不同表现形式或形态的能力。

二、多态前提
1、有继承/实现关系
2、有方法重写
3、有父类引用指向子类对象
我们在这里创建一个抽象类和两个子类,然后子类将父类方法重写。

接着我们用父类引用指向子类对象

我们可以发现,左右两边的类型并不相同但是并没有报错。
三、多态的好处
1、对象多态:
前面我们用父类引用可以指向子类对象就是对象多态的一个例子。
2、行为多态:
我们在主方法下面创建一个新的方法,然后将方法的形参设置为父类对象。

然后我们将两个子类对象分别传入父类方法中

发现方法中可以接收两种子类对象。

四、多态中成员访问特点
1、成员变量:编译看左边(父类),运行看左边(父类)
我们先创建一个父类和一个子类,将父类中的num定义为10,将子类中的num定义为20,然后我们用父类引用去指向子类对象,然后打印出对象num变量的值。


我们会看到,打印出的num值是父类中的值。
2、成员方法:编译看左边(父类),运行看右边(子类)
我们用对象去调用成员方法

发现结果走的是子类的成员方法

因为程序会担心调用的父类的方法是一个抽象方法,所以会走子类的重写方法。
3、特殊情况:
前面我们说过建议被static修饰的成员变量和成员方法,建议使用类名去调用。在多态中假如我们去使用对象名调用静态的static成员方法,程序会运行父类的方法,因为在字节码文件生成之后,程序会自动将对象名改为类名去调用。
五、多态的好处和弊端
1、好处:提高了程序的扩展性
2、弊端:不能使用子类特有的成员
六、多态中的转型
1、向上转型
从子到父:父类引用指向子类对象
将子类对象的地址赋值给父类引用


2、向下转型
从父到子:将父类引用所指的对象,转交给子类类型。

这里不能直接赋值,必须做强制类型转换。
七、注意事项:
当我们用转型去调用对象的方法时,很容易报错,因为我们不能判断这个对象是不是这个类的成员。

我们可以利用if语句和instanceof关键字来判断左边的引用是不是右边的数据类型。
