实验5继承及接口.docx
- 文档编号:10861962
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:42
- 大小:25.82KB
实验5继承及接口.docx
《实验5继承及接口.docx》由会员分享,可在线阅读,更多相关《实验5继承及接口.docx(42页珍藏版)》请在冰豆网上搜索。
实验5继承及接口
实验5继承与接口
[实验目的]
1、掌握java继承中父类及其子类的定义方法。
2、掌握子类重写父类同名方法的方法。
3、掌握接口的用法。
(1)学习如何定义接口;
(2)掌握接口的实现方式;
(3)使用实现了接口的类;
(4)理解接口与抽象类的区别。
[实验要求]
1、复习理论教学中所学的内容。
2、认真进行实验预习,查阅参考书,书写源程序,书写实验预习报告。
3、认真总结实验并书写实验报告。
[实验课时]2学时
[实验教学方式]学生上机实验,教师随堂指导。
[实验内容]
1、类的继承性练习
【新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。
新类还可添加新的变量和方法。
这种现象就称为类的继承。
当建立一个新类时,不必写出全部成员变量和成员方法。
只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。
被继承的类称为父类或超类(superclass),这个新类称为子类。
Java提供了一个庞大的类库让开发人员继承和使用。
设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。
你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。
所以,通常要对子类进行扩展,即添加新的属性和方法。
这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。
继承的意义就在于此。
】【】中的读完删掉不作为实验报告的一部分
(一)创建将被继承的类
(1)程序源代码如下。
publicclassEXP3_7
{
protectedStringxm;//姓名,具有保护修饰符的成员变量
protectedintxh;//学号
voidsetdata(Stringxm,intxh)//设置数据的方法
{
此处添加所需代码
}
publicvoidprint()//输出数据的方法
{
","+xh);
}
}
(2)编译源程序。
publicclassEXP3_7{
protectedStringxm;//姓名,具有保护修饰符的成员变量
protectedintxh;//学号
voidsetdata(Stringxm,intxh)//设置数据的方法
{
this.xh=xh;
this.xm=xm;
}
publicvoidprint()//输出数据的方法
{
","+xh);
}
}
(二)创建将被继承的类
(1)程序功能:
通过EXP3_7类产生子类EXP3_8,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、bj(bj)。
在程序中调用了父类的print方法,同时可以看出子类也具有该方法。
(2)程序源代码如下。
classEXP3_8extendsEXP3_7{
此处定义新的成员变量,均为protected类型
publicstaticvoidmain(Stringargs[]){
EXP3_7p1=newEXP3_7();
p1.setdata("李四",12321);
p1.print();
EXP3_8s1=newEXP3_8();
s1.setdata("张三",12345);//调用父类的成员方法
s1.xy="山西大学计算机学院";//访问本类的成员变量
s1.bj="2008级计算机科学与技术";//访问本类的成员变量
s1.print();
","+s1.xy+","+s1.bj);
}
}
(1)编译并运行,结果如图3.7所示。
classEXP3_8extendsEXP3_7{
Stringxy;
Stringbj;
publicstaticvoidmain(Stringargs[]){
EXP3_7p1=newEXP3_7();
p1.setdata("李四",12321);
p1.print();
EXP3_8s1=newEXP3_8();
s1.setdata("张三",12345);//调用父类的成员方法
s1.xy="山西大学计算机学院";//访问本类的成员变量
s1.bj="2008级计算机科学与技术";//访问本类的成员变量
s1.print();
","+s1.xy+","+s1.bj);
}
}
李四,12321
张三,12345
张三,山西大学计算机学院,2008级计算机科学与技术
运行结果贴图
图3.7
(三)了解成员方法的覆盖方式
【通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的方法,简称为方法覆盖(override)。
方法覆盖为子类提供了修改父类成员方法的能力。
例如,子类可以修改层层继承下来的Object根类的toString方法,让它输出一些更有用的信息。
下面的程序显示了在子类Circle中添加toString方法,用来返回圆半径和圆面积信息。
】【】中的读完删掉不作为实验报告的一部分
(1)编写覆盖Object类toString方法的程序文件EXP3_9.java,源代码如下。
classCircle{
privateintradius;
定义一个参数的构造方法
对于私有成员radius进行get和set(定义getRadius()和setRadius())
定义求面积方法area()
publicStringtoString(){
return"圆半径:
"+getRadius()+"圆面积:
"+area();
}
}
publicclassEXP3_9{
publicstaticvoidmain(Stringargs[]){
Circlec=newCircle(10);
"\n"+c.toString());
}
}
(2)编译并运行,结果如图3.8所示。
classCircle{
privateintradius;
publicCircle(intradius){
super();
this.radius=radius;
}
publicCircle(){
super();
}
publicintgetRadius(){
returnradius;
}
publicvoidsetRadius(intradius){
this.radius=radius;
}
doublearea()
{
returnMath.PI*radius*radius;
}
publicStringtoString(){
return"圆半径:
"+getRadius()+"圆面积:
"+area();
}
classEXP3extendsCircle{
publicstaticvoidmain(Stringargs[]){
Circlec=newCircle(10);
"\n"+c.toString());
}
}
}
}
圆半径:
10圆面积:
314.89793
(3)试着以Point类为例,尝试为Object类的clone()和equals()方法进行覆盖,Point类包含私有成员x,y,构造方法1(包含两个参数a,b),构造方法2(参数为Pointp),clone方法,equals方法,toString方法。
用TestPoint类进行测试。
运行结果贴图
图3.8
classObject{
publicStringclone(){
return"thisisclone";
}
publicStringequals(){
return"thisisequals";
}
}
publicclassPointextendsObject{
privatedoublex;
privatedoubley;
publicPoint(doublea,doubleb){
super();
this.x=a;
this.y=b;
}
publicPoint(Pointp){
}
publicStringclone(){
return"thisisaclonekkk";
}
publicStringequals(){
return"thisisaequalskkk";
}
publicStringtoString(){
return"Point[x="+x+",y="+y+"]";
}
}
publicclassTestPoint{
publicstaticvoidmain(Stringargs[])
{
Points=newPoint(2,3);
;
;
}
}
thisisaclonekkk
thisisaequalskkk
(四)this、super和super()的使用
(1)程序功能:
程序功能:
说明this、super和super()的用法。
程序首先定义Point(点)类,然后创建点的子类Line(线)。
最后通过LX3_10类输出线段的长度。
程序中通过super(a,b)调用父类Point的构造方法为父类的x和y赋值。
在子类Line的setLine方法中,因为参数名和成员变量名相同,为给成员变量赋值,使用this引用,告诉编译器是为当前类的成员变量赋值。
在length和toString方法中使用父类成员变量时,使用super引用,告诉编译器使用的是父类的成员变量。
(2)程序源代码如下。
classPoint{
protectedintx,y;
Point(inta,intb){
setPoint(a,b);
}
publicvoidsetPoint(inta,intb){
x=a;
y=b;
}
}
classLineextendsPoint{
protectedintx,y;
Line(inta,intb){
super(a,b);
setLine(a,b);
}
publicvoidsetLine(intx,inty){
this.x=x+x;
this.y=y+y;
}
publicdoublelength(){
intx1=super.x,y1=super.y,x2=this.x,y2=this.y;
returnMath.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
publicStringtoString(){
return"直线端点:
["+super.x+","+super.y+"]["+
x+","+y+"]直线长度:
"+this.length();
}
}
publicclassEXP3_10{
publicstaticvoidmain(Stringargs[]){
Lineline=newLine(50,50);
"\n"+line.toString());
}
}
(3)编译并运行,结果如图3.9。
运行结果贴图
classPoint{
protectedintx,y;
Point(inta,intb){
setPoint(a,b);
}
publicvoidsetPoint(inta,intb){
x=a;
y=b;
}
}
classLineextendsPoint{
protectedintx,y;
Line(inta,intb){
super(a,b);
setLine(a,b);
}
publicvoidsetLine(intx,inty){
this.x=x+x;
this.y=y+y;
}
publicdoublelength(){
intx1=super.x,y1=super.y,x2=this.x,y2=this.y;
returnMath.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
publicStringtoString(){
return"直线端点:
["+super.x+","+super.y+"]["+
x+","+y+"]直线长度:
"+this.length();
}
}
publicclassEXP3_10{
publicstaticvoidmain(Stringargs[]){
Lineline=newLine(50,50);
"\n"+line.toString());
}
}
直线端点:
[50,50][100,100]直线长度:
70.865476
(五)1、定义父类People,分别定义People类的子类ChinaPeople,AmericanPeople和BeijingPeople并分别重写父类中的各个方法。
最后在主方法中分别创建各子类的对象并调用各自的方法打印输出信息。
该程序的模板代码如下:
请将其补充完整并调试运行。
classPeople
{
protecteddoubleweight,height;
publicvoidspeakHello()
{
"yayawawa");
}
publicvoidaverageHeight()
{
height=173;
"averageheight:
"+height);
}
publicvoidaverageWeight()
{
weight=70;
"averageweight:
"+weight);
}
}
classChinaPeopleextendsPeople
{
【代码1】//重写publicvoidspeakHello()方法,要求输出类似“你好,吃了吗”这样的
//汉语信息
【代码2】//重写publicvoidaverageHeight()方法,要求输出类似
//“中国人的平均身高:
168.78厘米”这样的汉语信息
【代码3】//重写publicvoidaverageWeight()方法,
//要求输出类似“中国人的平均体重:
65公斤”这样的汉语信息
publicvoidchinaGongfu()
{
【代码4】//输出中国武术的信息,例如:
"坐如钟,站如松,睡如弓"等
}
}
classAmericanPeopleextendsPeople
{
【代码5】//重写publicvoidspeakHello()方法,要求输出类似
//“Howdoyoudo”这样的英语信息。
【代码6】//重写publicvoidaverageHeight()方法
【代码7】//重写publicvoidaverageWeight()方法
publicvoidamericanBoxing()
{
【代码8】//输出拳击的信息,例如,“直拳”、“钩拳”等
}
}
classBeijingPeopleextendsChinaPeople
{
【代码9】//重写publicvoidspeakHello()方法,要求输出类似“您好”这样的汉语信息
【代码10】//重写publicvoidaverageHeight()方法
【代码11】//重写publicvoidaverageWeight()方法
publicvoidbeijingOpera()
{
【代码12】//输出京剧的信息
}
}
publicclassExample
{
publicstaticvoidmain(Stringargs[])
{
ChinaPeoplechinaPeople=newChinaPeople();
AmericanPeopleamericanPeople=newAmericanPeople();
BeijingPeoplebeijingPeople=newBeijingPeople();
chinaPeople.speakHello();
americanPeople.speakHello();
beijingPeople.speakHello();
chinaPeople.averageHeight();
americanPeople.averageHeight();
beijingPeople.averageHeight();
chinaPeople.averageWeight();
americanPeople.averageWeight();
beijingPeople.averageWeight();
chinaPeople.chinaGongfu();
americanPeople.americanBoxing();
beijingPeople.beijingOpera();
beijingPeople.chinaGongfu();
}
}
packagechengxu;
classPeople
{
protecteddoubleweight,height;
publicvoidspeakHello()
{
"yayawawa");
}
publicvoidaverageHeight()
{
height=173;
"averageheight:
"+height);
}
publicvoidaverageWeight()
{
weight=70;
"averageweight:
"+weight);
}
}
classChinaPeopleextendsPeople
{
publicvoidspeakHello()
{
"你好,吃了吗?
");
}
publicvoidaverageHeight()
{
height=168.78;
"中国人的平均身高:
"+height+"厘米");
}
publicvoidaverageWeight()
{
weight=70;
"中国人的平均体重:
"+weight+"公斤");
}
publicvoidchinaGongfu()
{
"坐如钟,站如松,睡如弓");
}
}
classAmericanPeopleextendsPeople
{
publicvoidspeakHello()
{
"howdoyoudo");
}
publicvoidaverageHeight()
{
height=179;
"averageheight:
"+height+"cm");
}
publicvoidaverageWeight()
{
weight=90;
"averageweight:
"+weight+"kilogram");
}
publicvoidamericanBoxing()
{
"直拳,勾拳");
}
}
classBeijingPeopleextendsChinaPeople
{
publicvoidspeakHello()
{
"您好");
}
publicvoidaverageHeight()
{
height=168;
"averageheight:
"+height+"厘米");
}
publicvoidaverageWeight()
{
weight=75;
"averageweight:
"+weight+"公斤");
}
publicvoidbeijingOpera()
{
"京剧");
}
}
packagechengxu;
publicclassExample{
publicstaticvoidmain(Stringargs[])
{
ChinaPeoplechinaPeople=newChinaPeople();
AmericanPeopleamericanPeople=newAmericanPeople();
BeijingPeoplebeijingPeople=newBeijingPeople();
chinaPeople.speakHello();
americanPeople.speakHello();
beijingPeople.speakHello();
chinaPeople.averageHeight();
americanPeople.averageHeight();
beijingPeople.averageHeight();
chinaPeople.averageWeight();
americanPeople.averageWeight();
beijingPeople.averageWeight();
chinaPeople.chinaGongfu();
americanPeople.americanBoxing();
beijingPeople.beijingOpera();
beijingPeople.chinaGongfu();
}
}
你好,吃了吗?
how
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 继承 接口