10.3 通过实例熟悉多态用法
【实例10.10】通过前面的几节描述,已经了解了多态的实质。本节将通过实例巩固其概念和用法,为以后实际开发奠定良好的基础。这个实例先构造一个类,然后让后面的类继承前面的类,最后再将对象输出。先看这个实例的流程,如图10.1所示。
图 10.1 一个综合实例的流程图
在这个实例中,创建一个父学生类,再创建一个继承的子学生类。创建一个父学生类的对象句柄,用其指向子学生类的对象。最后,将使用这个对象句柄来引用父类中没有的方法。这会是什么样的结果呢?
///这是一个主运行类
///通过构造器构造出sc, sm, sc1这三个对象
///通过set设置器来设置三个对象的参数
///通过tostring方法来让三个对象以字符串形式输出
public class studenttest
{
public static void main(String[]args)
{
studentclass sc=new studentclass();
studentmen sm=new studentmen();
studentclass sc1=new studentmen();
sc.set("王浩","1","男");
sc.set(90.5);
sm.set("张杰","2","男");
sm.set(99.0);
sm.set("班长");
System.out.println(sc.toString());
System.out.println(sm.toString());
sc1.set("赵丽","3","女");
sc1.set(100);
sc1.set("学习委员");
System.out.println(sc1.toString());
}
}
///这是一个学生类
///通过设置器设置了姓名、 学号、 性别、成绩等参数
///通过访问器可以获得这些参数的值
///通过tostring方法可以让对象以字符串形式输出
///这里有两个方法,方法名称一样。但是参数不一样。其实就是一个多态的概念
class studentclass
{
String name;
String code;
String sexy;
double achievement;
public void set(String name, String code, String sexy)
{
this.name=name;
this.code=code;
this.sexy=sexy;
}
public void set(double achievement)
{
this.achievement=achievement;
}
public String getname()
{
return name;
}
public String getcode()
{
return code;
}
public String getsexy()
{
return sexy;
}
public double getachi()
{
return achievement;
}
public String toString()
{
String infor="学生 姓名:"+name+""+" 学号:"+code+""+" 性别:"+sexy+""+"成绩:"+achievement;
return infor;
}
}
///这也是一个学生类,不过它继承了上面那个学生的类
///通过设置器设置了职务,在这里就没有设置姓名、 学号、 性别、成绩等参数。因为它继承了上面的类的参数
///通过访问器可以获得职务这个参数的值
///通过tostring方法可以让对象以字符串形式输出
class studentmen extends studentclass
{
private String duty;
public void set(String duty)
{
this.duty=duty;
}
public String getduty()
{
return duty;
}
public String toString()
{
String infor="学生 姓名:"+name+""+" 学号:"+code+""+" 性别:"+sexy+""+"职务:
"+duty+""+"成绩:"+achievement;
return infor;
}
}
【代码说明】这个程序段没有通过编译,问题就出现在对象多态的概念上。“studentclass sc1=new studentmen()”通过使用“studentclass”类的对象句柄来操作子类“studentmen”的对象,根据前面的介绍,这个句柄只能操作父类中有而被子类覆盖的方法,所以不能使用sc1.set(“学习委员”)这一句。
【运行效果】如果将此句去掉,这个程序段的运行结果为:
学生 姓名:王浩 学号:1 性别:男成绩:90.5
学生 姓名:张杰 学号:2 性别:男职务:班长成绩:99.0
学生 姓名:赵丽 学号:3 性别:女职务:null成绩:100.0
整个程序段中包含了很多知识点:重载、覆盖和继承等,希望读者能体会整个程序的编程思路和代码的精华之处。