10.3 通过实例熟悉多态用法

【实例10.10】通过前面的几节描述,已经了解了多态的实质。本节将通过实例巩固其概念和用法,为以后实际开发奠定良好的基础。这个实例先构造一个类,然后让后面的类继承前面的类,最后再将对象输出。先看这个实例的流程,如图10.1所示。


10.3 通过实例熟悉多态用法 - 图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


整个程序段中包含了很多知识点:重载、覆盖和继承等,希望读者能体会整个程序的编程思路和代码的精华之处。