多态概述
多态:
可以理解为事物存在的多种体现形态。
1、多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的子类对象。
2、多态的前提
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提,存在覆盖。
3、 多态的好处
多态的出现大大的提高了程序的扩展性.
多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
4、多态的应用
5、多态的出现代码中的特点(多态使用的注意事项)。
多态转型
多态转型(类型提升/向上转型、向下转型)
如果想要调用子类的特有方法时,强制将父类的引用转成子类类型。
多态自始至终都是子类对象在做着变化。
******************************************
在多态中【<非静态>成员函数】的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,否则失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,【成员变量】的特点:
无论编译和运行,都参考左边(引用变量所属的类)。
在多态中,【静态成员函数】的特点:
无论编译和运行,都参考左边。
package chapter04;
//定义一个抽象类 Animal
abstract class Animal
{
int num=5;
abstract void eat();
//void eat(){}
public void sleep()
{
System.out.println("晚上睡觉");
}
public static void speak()
{
System.out.println("听见动物叫");
}
}
//对Animal类的对象或者子类对象进行操作
class DoAnimal
{
public static void doAnim(Animal anim)
{
anim.eat();
anim.sleep();
anim.speak();
}
}
//Animal的子类Cat,在其中实现抽象方法eat(),覆盖方法sleep(),覆盖静态方法speak()。
class Cat extends Animal
{
int num=88;
public void eat()
{
System.out.println("吃鱼");
}
public void sleep()
{
System.out.println("白天睡觉");
}
public static void speak()
{
System.out.println("听见猫叫");
}
}
//Animal的子类Dog,在其中实现抽象方法eat(),覆盖静态方法speak()。
class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨头");
}
public static void speak()
{
System.out.println("听见狗叫");
}
}
class MultiDemo
{
public static void main(String[] args)
{
/*
在多态中,非静态成员函数在多态调用时,编译看左边,运行看右边。
在多态中,静态成员函数的特点:无论编译和运行,都参考左边。
*/
DoAnimal.doAnim(new Cat());
DoAnimal.doAnim(new Dog());
/*
在多态中,【成员变量】的特点:无论编译和运行,都参考左边(引用变量所属的类)。
*/
Animal anim=new Cat();
System.out.println(anim.num);//结果显示为5
}
}