什么是多态?
多态:就是同一种行为(如move()),作用在不同的对象上(如cat、bird),有不同的表现结果(如cat走猫步,bird会飞翔)。还在于java支持父类型引用指向子类型对象(向上转型,也就是自动转型)。
怎么实现多态?(原理:以cat.move()为例)
一、编译阶段——静态绑定
在编译阶段,对编译器来说,他只知道cat的类型是Animal,然后就会直接到Animal.class字节码文件中找move()方法,找到了则编译通过,静态绑定成功。
二、运行阶段——动态绑定
在运行阶段,实际上在堆内存中创建的java对象是cat对象,所有cat调move()方法的时候,真正参与move的对象是一只猫,所有运行阶段会动态的执行cat对象的move()方法,这个过程就是运行阶段的绑定。
代码实例:
/**
* @author Jason
* @create 2020-04-23 15:31
* 测试类
*/
public class AnimalTest {
public static void main(String[] args) {
Animal cat1 = new Cat();
cat1.move();
Animal bird1 = new Bird();
bird1.move();
Cat cat=(Cat)cat1;
cat.catchMouse();
Bird bird = (Bird)bird1;
bird.sing();
}
}
/**
* @author Jason
* @create 2020-04-23 15:22
* 父类:动物类
*/
public class Animal {
public void move(){
System.out.println("动物在行走...");
}
}
/**
* @author Jason
* @create 2020-04-23 15:27
* 子类:鸟类
*/
public class Bird extends Animal {
/**
* 重写父类的方法
*/
public void move(){
System.out.println("鸟儿自由飞翔...");
}
/**
* 子类特有的方法
*/
public void sing(){
System.out.println("鸟儿在唱歌...");
}
}
/**
* @author Jason
* @create 2020-04-23 15:24
* 子类:猫类
*/
public class Cat extends Animal {
/**
* 重写父类的方法
*/
public void move(){
System.out.println("猫在走猫步...");
}
/**
* 子类特有的方法
*/
public void catchMouse(){
System.out.println("猫在抓老鼠...");
}
}
怎么转型?
一、向上转型(子类型向父类型转换—自动转)
例如:Animal cat = new Cat();我们经常这样使用,自动就转换了。
二、向下转型(父类型向子类型转换—强制转)
这种转换什么时候用呢?——当我们需要访问到子类型对象中特有的方法的时候用到。
例如:
Animal cat1 = new Cat();
cat1.move();
Cat cat=(Cat)cat1;
cat.catchMouse();
综合代码实例:(多态机制的应用,面向抽象,不面向具体编程)
/**
* @author Jason
* @create 2020-04-23 16:22
*/
public class PetTest {
public static void main(String[] args) {
Master jason = new Master();
Dog diandian = new Dog();
jason.feed(diandian);
}
}
/**
* 主人类
*/
public class Master {
//面向抽象编程,不面向具体编程
//多态机制的体现
public void feed(Pet pet){
pet.eat();
}
}
/**
* 父类:宠物类
*/
public class Pet {
public void eat(){
}
}
/**
* @author Jason
* @create 2020-04-23 16:18
*/
public class Dog extends Pet {
public void eat(){
System.out.println("主人给狗狗吃骨头...");
}
}
/**
* @author Jason
* @create 2020-04-23 16:19
*/
public class Cat extends Pet {
public void eat(){
System.out.println("猫咪喜欢吃主人给的小鱼...");
}
}