第一题.目的:验证内部类对象总与创建它的外部类对象关联 .................................. 1 第二题.定义一个Father类 .............................................................................................. 1 第三题.修改BankAccount ............................................................................................... 2 第四题.拷贝自身重要数据 .............................................................................................. 3 第五题.连锁店问题 .......................................................................................................... 4 第六题.修改外围类对象数据,影响内部类行为 .......................................................... 4 第七题.迭代器的局部类实现 .......................................................................................... 6 第一题参考答案 ............................................................................................................... 7 第二题参考答案 ............................................................................................................... 7 第三题参考答案 ............................................................................................................... 8 第四题参考答案 ............................................................................................................. 10 第五题参考答案 ............................................................................................................. 10 第六题参考答案 ............................................................................................................. 11 第七题参考答案 ............................................................................................................. 11
实验五. 内部类,局部类,匿名类 背景知识 内部类 内部类对象的创建 局部类 匿名类 实验目的
1. 掌握内部类,局部类,匿名类概念 2. 学习定义内部类,局部类,匿名类。 3. 学习创建内部类,局部类,匿名类对象。 实验内容和步骤
第一题.目的:验证内部类对象总与创建它的外部类对象关联
1.
2. 3. 4. 5. 6.
定义一个类A,它有一个内部类B.
定义B的方法g,它访问A的数据成员。 定义A的方法f,它访问B的数据成员,注意必须指明那个内部类对象的数据成员。 确保类A有方法修改A的域。
确保类B有方法print,输出A的域。
定义类C,它只有一个main方法。在main方法体内创建A类对象a。a作为外围对象创建B类对象b; 7. 验证:每个内部类对象,都有一个相关联的外部类对象,就是创建它的外部类对象。
方法:首先对象b调用print,打印a的域,然后修改a的域,最后b再次调用print,打印a的域,打印结果应该与对a的修改一致,从而说明b与a相关联。
第二题.定义一个Father类
它包括:
1. 内部类Son,表示儿子的类,包括
a) 数据域phone,表示儿子电话号。 b) 内部类构造方法
c) CallFather方法,给父亲打电话,打印“xxx给yyy打电话”即可,xxx
是儿子电话号,yyy是父亲电话号。
2. 数据域phone,表示父亲电话号。 3. Son数组,保存儿子。 4. count,保存儿子个数 5. 构造函数。
6. 给儿子打电话的方法CallSon,打印“给xxx打电话”即可,xxx是儿子电话号。
第三题.修改BankAccount
给下面的BankAccount类添加一个方法,显示number,balance,lastaction。 然后写main方法,首先创建两个账户,然后执行存款,取款,转账动作,每个动作之后都显示账户信息。体会内部类的作用。
public class BankAccount //银行帐号类定义 {
private long number;//帐号 private long balance;//余额
//内部类对象.最后一次去银行的动作:存款,取款,转账 private Action lastaction; public class Action//内部类. { }
private String act;//描述动作的串 private long amount;//存取的金额
Action(String a,long amo)//构造函数,指出动作和金额 {
act=a;
amount=amo; }
public void deposit(long amount)//存款 {
balance+=amount;
//动作:\和金额
lastaction=new Action(\}
public void withdraw(long amount)//取款 {
balance-=amount; }
//动作:\和金额
lastaction=new Action(\
public void transfer(BankAccount other,long amount)//转账 {
other.withdraw(amount); deposit(amount);
lastaction=new Action(\转入 other.lastaction=other.new
Action(\转出
} }
第四题.拷贝自身重要数据
读如下java程序,回答问题。一个类希望能够拷贝对象自身的重要数据,以便在必要的时候恢复这个对象。为此该类有一个datacpy bak域,它保存重要数据的拷贝,其中datacpy是一个内部类。 class data { int i; String s; datacpy bak; public data(int j,String t){i=j;s=t;} //内部类
class datacpy { int b; public datacpy() { b=i; } } public void copy() { bak=new datacpy(); } public void resume() { i=bak.b; } public void change(){i++;} public void print()
{System.out.println(i+\}
public class test_main { public static void main(String[] args) { data x=new data(1,\ x.copy(); x.print(); x.change(); x.print(); x.resume(); x.print(); } }
1.data类如何备份重要数据?
2.给出main方法每一语句的注释。 3.修改程序,使得也备份域s。 4. 修改main方法,测试你的修改。 5. 体会内部类的作用。
第五题.连锁店问题
尝试用内部类解决下面问题。 一个连锁店有许多分店,这些分店对外公布的商品价格是price*ratio,其中price是总店制定的统一价格,ratio是总店下发给各个分店的系数,各个分店的ratio值可能不同。为了简单起见,假设该连锁店只销售一种商品,从而只有一个价格price。
现在要求设计一个表示总店的类,它有一个内部类,表示分店。实现如下目标:
1. 总店能够修改price,能够修改各个分店的ratio。
2. 每创建内部类的一个对象就相当于开了一家分店,构造函数需要初始化该分店的
ratio。
3. 总店能够记住它的所有分店。
4. 各个分店能够显示商品价格,即price*ratio。 5. 写main方法,测试你的实现。
第六题.修改外围类对象数据,影响内部类行为
读懂如下代码。回答问题: interface addition {
int add(int x,int y);
}
interface multiplication {
int multiply(int x,int y); }
class outer {
int part=5;
public multiplication f1() {
//局部类.它有一个方法,计算两个数的积+part。 class local implements multiplication {
public int multiply(int x,int y){return x*y+part;} }
return new local();//创建局部类对象,并返回 }
public addition f2() {
//匿名类,继承自Object,实现接口addition。 addition sum=new addition() {
//实现接口addition。
public int add(int x,int y){return x+y+part;}
};
return sum; } }
public class main_class {
public static void main(String[] args) {
outer out=new outer();
multiplication mul=out.f1(); outer out1=new outer();
multiplication mul1=out1.f1();
out.part=8;
out1.part=10000;
System.out.println(mul.multiply(10, 12));