-类继承与接口(三)实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江大学城市学院实验报告
课程名称:面向对象程序设计
实验项目名称:类继承与接口(三)
学生姓名:专业:软件工程学号:
实验地点:实验日期:年月日
【实验目的】
1.巩固Java类继承的相关知识
2.理解对象上转型技术的优点和用途。
3.掌握接口的特点
4.接口与抽象类的异同之处
【实验内容】
一、类继承相关知识强化
1. 执行以下程序,给出执行Bbb的结果,并说明指出类Bbb的this.i与super.i的含义(即它们都对应哪个变量)。
class Aaa{
int i;
Aaa(int a){ i = a;}
}
class Bbb extends Aaa{
int j,k;
Bbb(int i){
super(i);
j = this.i;
k = super.i;
}
public static void main(String[] args){
Bbb b = new Bbb(18);
System.out.println(b.j +"\t" + b.k);
}
}
执行Bbb的结果:
this.i与super.i的含义(即它们都对应哪个类中定义的变量):
this.i和super.i 都对应Aaa中的变量
2.接着上面例子,将类Bbb改写为以下代码,请写出程序运行结果,并说明这个例子与上面例子的区别。
class Bbb extends Aaa{
int i= -1,j= -1,k= -1; //比上面例子增加一个实例变量i;
Bbb(int i){
super(i);
j = this.i; //本语句含义是:
k = super.i; //本语句含义是:
}
public static void main(String[] args){
Bbb b = new Bbb(18);
System.out.println(b.j +"\t" + b.k);
}
}
执行Bbb的结果:
这个例子与上面例子的区别:
this.i对应Bbb中的i
super.i对应Aaa中的i
3.对以下程序,给出执行Bbb的结果,并分析Bbb中main方法中a.show(1), b.show(1),
c.show(1)的结果。
class Aaa{
void show(){
System.out.println("Aaa中定义的show()");
}
void show(int i){
System.out.println("Aaa中定义的show(int i)");
}
}
class Bbb extends Aaa{
void show(){
System.out.println("Bbb中定义的show()");
public static void main(String[] args){
Aaa a = new Aaa();
Bbb b = new Bbb();
Aaa c = new Bbb();
a.show(1);
b.show(1);
c.show(1);
}
}
执行Bbb的结果:
上面a.show(1)执行了那个类中定义的方法:
上面b.show(1);执行了那个类中定义的方法:
上面c.show(1)执行了那个类中定义的方法:
分析:
因为执行的是有参数的void show()所以调用的是Aaa中的方法。C是上转型所以也是调用Aaa中的方法
4. 对以下程序,给出执行Bbb的结果,并分析这个例子结果与前面第4个例子,你可以得出什么结论。
class Aaa{
int i = 10;
static void show(){
System.out.println("Aaa中定义的show()");
}
}
class Bbb extends Aaa{
int i = 20;
static void show(){
System.out.println("Bbb中定义的show()");
}
public static void main(String[] args){
Aaa a = new Aaa();
Bbb b = new Bbb();
Aaa c = new Bbb();
a.show();
b.show();
c.show();
((Bbb)c).show();
System.out.println(c.i); //考虑此处
System.out.println(((Bbb)c).i); //考虑此处
}
}
执行Bbb的结果:
((Bbb)c).show()执行结果:
System.out.println(c.i)执行结果:
System.out.println(((Bbb)c).i)执行结果:
分析与结论:
C进行的向上转型,将子类对象引用转换为超类类型。所以c.i引用的是超类中的I 而也可以通过(Bbb)c向下转型
二、程序分析思考
以下是例5.22的部分关键代码,请分析思考以下问题:
(1)Student类中设计抽象方法cost会带来什么好处?
因为不同的学生所需要的学费不同,所以用抽象cost方法在不用的学生中调用cost 执行不同的代码返回对应的值。
(2)Student类的compareCost方法可以用于比较哪些类型的对象?如果没有设计抽象方法cost,那么会发生什么问题?
可以比较上转型对象和子类对象。
如果没有抽象方法cost那么就必须在每一个子类都编写一个compareCost 导致太多的重复代码。
注意:分析重点是软件设计的通用性考虑。
abstract class Student {//定义学生对象的抽象超类
private String name;
public Student(String name){ = name; }
public abstract double cost();//声明抽象方法,表示学习费用