实验11-类继承与接口(三)实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的含义(即它们都对应哪个类中定义的变量):

都对应Aaa类中的变量。

2.接着上面例子,将类Bbb改写为以下代码,请写出程序运行结果,并说明这个例子与上面例子的区别。

class Bbb extends Aaa{

int i= -1,j= -1,k= -1; //比上面例子增加一个实例变量i;

Bbb(int i){

super(i);

j = this.i; //本语句含义是:Bbb类中的变量i的值赋给j

k = super.i; //本语句含义是:访问Aaa类中的变量i并将值赋给k

}

public static void main(String[] args){

Bbb b = new Bbb(18);

System.out.println(b.j +"\t" + b.k);

}

}

执行Bbb的结果:

-1 18

这个例子与上面例子的区别:

在Bbb类中也定义了变量i,将Bbb的直接超类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()");

}

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)执行了那个类中定义的方法: Aaa类

上面b.show(1);执行了那个类中定义的方法: Aaa类

上面c.show(1)执行了那个类中定义的方法: Aaa类

分析:类Bbb中的方法覆盖的的是类Aaa中的void show()方法,并未覆盖void show(int i),而 a.show(1);b.show(1);c.show(1);都是执行了Aaa类中的void show(int i)方法。a.show(1)是直接访问超类Aaa中的void show(int i)方法,b.show(1)是子类Bbb继承了类Aaa中的void show(int i)方法,从而执行,c.show(1)中c是上转型对象,子类对象的引用向上转型为超类类型,从而执行void show(int i)方法。

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()");

}

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()执行结果: Bbb中定义的show()

System.out.println(c.i)执行结果: 10

System.out.println(((Bbb)c).i)执行结果: 20

分析与结论:

A aa c = new Bbb();中c为上转型对象,将子类对象的引用转为超类类型,c本是子类Bbb 的对象,但通过向上转型,c.i引用的是超类的变量,同时也可以通过(Bbb)c)的方式将c强制向下转型,则( (Bbb)c).i访问的是子类Bbb的成员变量。

二、程序分析思考

以下是例5.22的部分关键代码,请分析思考以下问题:

(1)Student类中设计抽象方法cost会带来什么好处?

(2)Student类的compareCost方法可以用于比较哪些类型的对象?如果没有设计抽象方法cost,那么会发生什么问题?

注意:分析重点是软件设计的通用性考虑。

abstract class Student {//定义学生对象的抽象超类

private String name;

public Student(String name){ = name; }

public abstract double cost();//声明抽象方法,表示学习费用

public double compareCost(Student otherStudent){//当前对象与参数对象的费用比较return this.cost() - otherStudent.cost(); //返回大于、等于、小于零的数字

相关文档
最新文档