一、方法的多态
方法的多态,在之前我们学到的方法重载、方法重写,这两个都体现了方法的多态
1.例子
//测试类
public class test{
public static void main(String[]args){
A a = new A();
a.sum(1.1 ,5 );//此时调用的方法是A中的第一个方法
a.sum(5 ,1.1 );//此时调用的方法是A中的第二个方法
B b = new B();
a.total();
b.total();//不同的对象调用的total方法是不一样的
}
}
class A{
//方法的重载
public void sum(int n1, double n2){
System.out.println("sum = int n1 + double n2 ");
}
public void sum(double n1, int n2){
System.out.println("sum = double n1 + int n2 ");
}
//方法重写
public void total(){
System.out.println("A的total被调用");
}
}
class B extends A{
//方法重写
public void total(){
System.out.println("B的total被调用");
}
}
2.总结
从上面的代码,我们看出,一个方法有不同种的形态,这就是多态的一种体现
二、对象的多态
对象的多态将会会涉及到大量的封装和继承关系,对这两个知识点不清楚的同学,可以看我以往的文章,有进行相应的解释
1.编译类型和运行类型
语法
编译类型 对象引用名 = new 运行类型();
在我们进行创建对象的时候,我们都会用到new语句,在new语句 “ = ” 的左边的类型就是编译类型,“ = ” 的右边就是运行类型
那我们现在知道了什么是编译类型和运行类型
那它有什么用呢?
让我细细为你道来
首先当我们的代码中有 父类 和 子类 存在的时候,我们创建对象可以这么创建
Animal animal = new Dog();
此时的编译类型是Animal,运行类型是Dog
这么创建对象有个好处就是
animal 这个对象引用可以调用 父类Animal 的所有方法(重写方法可以)
缺点就是 不能调用 子类Dog 的独有方法
使用animal.cry(),jvm会按照运行类型Dog,匹配到Dog类的cry()方法并调用
❗️注意
- 一个对象的编译类型和运行类型可以不一致
Animal animal = new Dog();
Animal animal = new Animal();- 一定要记得的是,编译类型在对象创建的时候就确定了,不能更改;运行类型是可以改变的
2.总结
一个父类的对象引用可以指向子类的对象,运行时是以“运行类型”为主