多态
多态:就是某一类事物的多种存在形态。
使用多态的前提是:类与类之间有关系,要么是继承关系,要么是实现。
多态体现在:父类的引用指向了子类的对象,而且也可以接收自己的子类对象。
我们来看一个简单的多态应用练习题,来深入的理解多态。
现在有两种班级,一个是基础班,一个是高级班,用多态体现出来。
首先对这两类进行共同的特点抽取
基础班学生和高级班学生他们都是学生 这个大类的,都具有学习这个基本的功能,而且都需要睡觉。
那我们单独的将学生提取为一个类。
abstract class Student
{
abstract void study();
public void sleep()
{
System.out.println("zzzzzzzz");
}
}
将学习定义为一个抽象方法,是因为基础班和高级班学习的内容是不同的,但是他们都具备学习这个特性,那么我们定义为抽象方法,在子类中进行复写。
来定义两个子类
class BaseStudent extends Student
{
public void study()
{
System.out.println("basestudy");
}
public void sleep()
{
System.out.println("huhuhu");
}
}
class AdvStudent extends Student
{
public void study()
{
System.out.println("adv study");
}
}
BaseStuden类 和AdvStudent类都继承了student类,是student类的两个子类,我们发现两个子类都对study()方法进行了复写,拥有各自的具体功能。在这里,我也将BaseStudent类的sleep()方法覆盖了,定义了自己的功能。
OK继承完成,那么我们接下来写主函数了?
要运行BaseStudent 类和AdvStudent类中的方法,我们就要建立这 两个类的对象,通过对象来调用方法。
好吧,写吧!
class DuoTaiUse
{
public static void main(String[]args)
{
BaseStudent bs = new BaseStudent();
bs.study();
bs.sleep();
AdvStudent as = new AdvStudent();
as.study();
as.sleep();
}
}
发现了主函数中有需多重复的代码,调用的方法都是一样的,那么我们能否将这部分代码提取出来,形成一个单独的类,给出一个对外的调用方法呢?
class Do
{
public void dosomething(Student stu)
{
stu.study();
stu.sleep();
}
}
我们将主函数改为
class DuoTaiUse
{
public static void main(String[]args)
{
Do d= new Do();
d.dosomething(new BaseStudent());
d.dosomething(new AdvStudent());
}
}
来看看执行过程:
主函数运行:Do d= new Do();创建Do类的一个对象,Do类加载进内存。继续运行, d.dosomething(new BaseStudent()); 我们发现,会有一个 Student stu=new BaseStudent(),stu是父类的引用,现在指向子类BaseStudent,运行dosomething()方法,那么就是在运行BaseStudent类中的study()方法和sleep()方法,同理,我们运行d.dosomething(new AdvStudent()); 就是在运行AdvStudent类中的 study()方法和sleep()方法。这就是父类的引用指向子类对象,提高了代码的复用性。
在这段代码中,我们抽取的Student类和Do类都是发现的共同特点所提取出来单独成类的。
那么我现在再加入一个新增的速成班呢?
也是可以的,先定义这个类,
class SuChengStudent extends Student
{
public void study()
{ }
public void sleep()
{ }
}
在主函数中只需要加入,
d.dosomething(new SuChengStudent());
比起之前,应用性和修改上都有很大的改观,因此,多态也大大的提高了程序的扩展性。