java中多态的应用
多态的应用有三个条件
1)继承
2)重写
3)向上转换 (基本引用去去引用派生类对象)
什么叫多态?上概念:就是用基类引用,引用不同的派生类对象,通过基类的引用变量调用同名覆盖方法,这个基类引用引用了哪个派生类对象,就会调用哪个派生类对象重写的方法
感觉这个概念已经很简洁了,有不懂的兄弟,可以多读几遍理解一下
静多态:编译时确定调用哪个方法 重载
动多态:运行时确定调用哪个方法 重写
好处是不用给每一个派生类提供相应的入口,而是用基类引用来接收所有的派生类对象,然后调用同名覆盖方法来实现多态调用
上代码:
interface IAnimal{ // 写一些动物特有得功能,不是每个动物都具有这里定义的功能
int DATA = 10; // public static final标识符
void fly(); // 接口的方法默认就是public abstract
}
abstract class Animal { // 拥有抽象方法的类,必须是一个抽象类
protected String name;//属性
public Animal(String name) {
this.name = name;//构造函数
}
// 给所有派生类保留统一的抽象方法,等待派生类去重写
public abstract void bark(); // 抽象方法
}
// 猫 - 实体类
class Cat extends Animal{
public Cat(String name) {
super(name);//用super继承有参构造函数
}
@Override // !!!在派生类中一定要重写基类继承来的抽象方法
public void bark() {
System.out.println(name + "bark: miao miao!");
}
}
// 狗 - 实体类
class Dog extends Animal{
public Dog(String name) {
super(name);
}
@Override
public void bark() {
System.out.println(name + "bark: wang wang!");
}
}
// 猪 - 实体类
class Pig extends Animal{
public Pig(String name) {
super(name);
}
@Override
public void bark() {
System.out.println(name + "bark: heng heng!");
}
}
// 鸟 - 实体类
class Bird extends Animal implements IAnimal{
public Bird(String name) {
super(name);
}
@Override
public void bark() {
System.out.println(name + "bark: ji ji zha zha!");
}
public void fly(){
System.out.println(name + " flying!!!");
}
}
/**
* 多态描述:
*
*/
public class 多态 {
/**
*
* 对扩展开放 对修改关闭
*/
public static void show(Cat cat){
cat.bark();
}
public static void show(Dog dog){
dog.bark();
}
public static void show(Pig pig){
pig.bark();
}
public static void show(Animal animal){ //
animal.bark(); // 通过函数的动态绑定做到的
// 如果这个动物是鸟的话,还要飞一下
if(animal instanceof IAnimal){
((IAnimal) animal).fly();
}
/**
* instanceof比较方法,判断animal是否属于IAnimal的一个实例化对象
*/
}
public static void main(String[] args) {
show(new Cat("加菲猫"));
show(new Dog("哈巴狗"));
show(new Pig("佩奇"));
show(new Bird("百灵鸟"));
}
}