多态分两种:
(1) 编译时多态(设计时多态):其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数。
(2) 运行时多态:而运行时多态是动态的,它是通过动态绑定来实现的,JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的是运行时多态,所以多态主要也是指运行时多态)
运行时多态的解释:
a.运行时多态是指程序中定义的引用变量所指向的具体类型和b.通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.
1.程序序中定义的引用变量所指向的具体类型不确定(即一个引用变量倒底会指向哪个类的实例对象) 。
2.通过该引用变量发出的方法调用在编程时并不确定(该引用变量发出的方法调用到底是哪个类中实现的方法) 。
在 java 面向对象中,Java 主要采用运行时多态,实现的必要条件为(AC)
A.要有继承
B.要有重载
C.要有父类引用指向子类对象(向上转型)
D.要有包
重载与重写是 Java 多态性
的不同表现。
重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定)
而重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。
多态的要点:
1.多态是方法的多态,不是属性的多态(多态与属性无关)
2.多态存在要有3个必要条件:继承、方法重写、父类引用指向子类对象。
3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
例如 :Object cat = new Cat();
三个必要条件:
继承:在多态中必须存在有继承关系的子类和父类。其中继承包括了接口的实现implements
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
关于使用使用父类引用指向子类对象:https://zhangvalue.blog.csdn.net/article/details/106269444
public class TestAnimal {
public static void main(String[] args) {
Animal a = new Animal();
animalCry(a);
Dog d = new Dog();
animalCry(d);
Cat t = new Cat();
animalCry(t);
}
//多态的关键,通过父类的引用调用子类重写的方法。
static void animalCry(Animal a) {
a.shout();
}
}
class Animal{
public void shout() {
System.out.println("animal 叫了一声");
}
}
class Dog extends Animal{
public void shout() {
System.out.println("dog 汪汪汪!");
}
}
class Cat extends Animal{
public void shout() {
System.out.println("cat 喵喵喵!");
}
}