多态的体现:父类或者接口的引用指向或者接收自己的子类对象。
多态的作用:多态的出现提高了程序的扩展性和后期维护性。
多态的前提:必须是类与类之间有关系。要么继承,要么实现。要对抽象方法进行覆盖。
多态的弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。
Animal a = new Cat();// 类型提升。向上转型。
Cat c = (Cat)a;//强制把父类的引用转成子类类型。 向下转型。
千万不要出现将父类对象转成子类类型
//Animal a = new Animal();
//Cat c = (Cat)a;
我们可以转换的是指向子类对象的父类引用,转成指向子类对象的该子类的引用。
多态自始至终都是子类在做着变化。
多态的示例:
多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。
在运行时期:参阅对象所属的类中是否有调用的方法。
总结: 成员函数在多态调用时,编译看左边,运行看右边。
多态中成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
多态中静态成员函数的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
多态的作用:多态的出现提高了程序的扩展性和后期维护性。
多态的前提:必须是类与类之间有关系。要么继承,要么实现。要对抽象方法进行覆盖。
多态的弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。
Animal a = new Cat();// 类型提升。向上转型。
Cat c = (Cat)a;//强制把父类的引用转成子类类型。 向下转型。
千万不要出现将父类对象转成子类类型
//Animal a = new Animal();
//Cat c = (Cat)a;
我们可以转换的是指向子类对象的父类引用,转成指向子类对象的该子类的引用。
多态自始至终都是子类在做着变化。
多态的示例:
abstract class Student
{
abstract void study();
abstract void sleep();
}
class BaseStudent extends Student
{
void study()
{
System.out.println("base study");
}
void sleep()
{
System.out.println("base sleep");
}
}
class AdvStudent extends Student
{
void study()
{
System.out.println("adv study");
}
void sleep()
{
System.out.println("adv sleep");
}
}
class DoStudent
{
public void doSome(Student stu)
{
stu.study();
stu.sleep();
}
}
class StudentDemo
{
public static void main(String[] args)
{
DoStudent ds = new DoStudent();
ds.doSome(new BaseStudent());
ds.doSome(new AdvStudent());
}
}
多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。
在运行时期:参阅对象所属的类中是否有调用的方法。
总结: 成员函数在多态调用时,编译看左边,运行看右边。
多态中成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
多态中静态成员函数的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。