多态
- 一个函数根据对象不同而对应不同实现
或者同一个行为具有多个不同表现形式或形态
多态实现
分为编译期多态和运行期多态
编译期多态通过函数重载来实现,在编译期就可以决定,也可以说为静多态
- 静态多态(静态绑定/编译器多态): —>函数的重载,且条件为:函数名相同,参数列表不同;
public class TestDemo {
public int add(int x,int y){//参数列表
return x+y;
}
public int add(int x,int y,int z){//参数列表
return x+y+z;
}
public static void main(String[] args) {
TestDemo t = new TestDemo();
System.out.println(t.add(1,2));
System.out.println(t.add(4,5,6));
}
}
运行时多态通过方法重写和继承来实现, 在运行期间决定要执行的目标方法,也可以称为动多态
- 动态多态(动态绑定/运行期多态):
而动多态就是函数的重写;
发生动态绑定的条件:1.继承 ,2.重写,3.向上造型(基类的引用,引用派生类的对象)
class Animal{
private String name;
public Animal(){ }
public void eat(){
System.out.println("怎么吃饭");
}
}
class Dog extends Animal{
public Dog(){
super();
}
@Override //重写:子类实现父类的方法
public void eat() {
System.out.println("dog吃饭");
}
}
class cat extends Animal{
public cat(){
super();
}
@Override
public void eat() {
System.out.println("cat吃饭");
}
}
public class TestDemo {
public static void main(String[] args) {
Animal a = new Dog(); //****
Animal a1 = new cat();
Animal animal = new Animal();
a.eat();
a1.eat();
animal.eat();
}
}
动多态的实现原理
动多态的实现原理是地址覆盖----->JVM中java栈,java堆,方法区
Animal a = new Dog();
a.eat();
堆里面有对象头,堆中开辟新的内存new Dog,对象头中有引用,引用的是class对象里的当前类的类信息(属性以及方法),通过class对象可以访问方法区的方法表(Dog的方法表和方法在栈里地址),重写完成后,Dog.eat()的地址覆盖掉了父类Animal.eat()的地址。