实验2:继承与接口
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩:
面向对象原理与Java实践课程实验报告
实验2:继承与接口
姓名 __xx xx__
班级 _ xxxxxxxxx __
学号 __xxxxxxxxxxx_ _
实验地点 __软件实验室_
实验时间 _2010.03.30_
指导教师 __xx xx
一、实验目的:
●掌握类的继承机制,掌握成员变量的隐藏与方法的重写
●掌握接口的定义和实现方法
二、实验要求:
●复习类的继承以及接口的设计方法
●注意保证类的封装性
●编写程序完成以下实验内容并上交实验报告
三、实验内容:
1、假定要为某个公司编写雇员工资支付程序。
这个公司有各种类型的雇员,不同类型的雇员按不同的方式支付工资:经理(Manager)每月获得一份固定的工资;销售人员(Salesman)在基本工资的基础上每月还有销售提成;一般工人(Worker)则按他每月工作的天数计算工资。
(提示:设计一个抽象类――雇员(Employee)描述雇员的共同特性,例如姓名(name)等。
这个类还应提供一个计算工资的抽象方法computeSalary(),使得可以通过为个类计算所有雇员的工资。
设计经理(Manager)类、销售人员(Salesman)类、一般工人(Worker)类,再设计一个演示用的类。
)
2、在前面的基础上对雇员工资计算程序进行扩充,即将一般雇员再细分为计时雇员(DailyWorker)和计件雇员(PieceWorker)两类,计时雇员按天计算工资额,而计件雇员按其生产的产品件数计算工资额。
(提示:设计这两个类,与前面的程序结合在一起,修改一下演示程序,演示这些类的用法。
)
3、在程序包packageOne中编写至少含一个方法的公有接口InterfaceOne。
在程序包packageTwo中定义公有类SuperClass,该类含有一个受保护的内部类InnerClass,这个类实现接口InterfaceOne。
在程序包packageThree中定义公有类SubClass继承SuperClass,类SubClass 定义一个返回类型为InterfaceOne的方法返回内部类InnerClass的对象实例。
请正确使用程序包组织以上类和接口,编译并运行,并观察编译器生成的字节码文件的命名方式。
四、设计思路:
1、2题
先设计一个抽象类----雇员(Employee),然后通过继承设计各种类型的雇员类,然后写已测试类main()方法中通过布尔变量实现程序的循环,使用if等语句实现程序功能。
3题
首先定义共有接口InterfaceOne;然后再定义公有类SuperClass,该类含有一个受保护的内部类InnerClass,内部类InnerClass实现接口InterfaceOne;接着定义类SubClass,该类定义了一个返回类型为InterfaceOne、返回内部类InnerClass的对象实例的方法;最后设计一个测试类实现程序功能。
五、程序源代码:
1、2题
//*****Employee类*****
public abstract class Employee {
public String name;
public double Wage;
public Employee(){
}
public Employee(String name){
=name;
}
public abstract void ComputerSalary();
public void show(){
System.out.print("姓名"+name+" 工资"+Wage);
}
}
//*****DailyWorker类*****
public class DailyWorker extends Employee{ public int Days;
public void ComputerSalary(){
Wage=Days*100;
}
public DailyWorker(String name,int Days){ =name;
this.Days=Days;
}
}
//*****Manager类*****
public class Manager extends Employee{
public void ComputerSalary(){
Wage=6000;
}
public Manager(String name){
=name;
}
}
//*****PieceWorker类*****
public class PieceWorker extends Employee{ public int Numbers;
public void ComputerSalary(){
Wage=Numbers*10;
}
public PieceWorker(String name,int Numbers){ =name;
this.Numbers=Numbers;
}
}
//*****Salesman类*****
public class Salesman extends Employee{
public double Sales;
public void ComputerSalary(){
Wage=3000+Sales*0.05;
}
public Salesman(String name,double Sales){
=name;
this.Sales=Sales;
}
}
//*****Main类*****
public class Main {
public static void main(String[] args) {
int i=0;
boolean d=true;
while(d){
System.out.println();
System.out.println("请选择取工资的雇员类型:");
System.out.println("1、经理");
System.out.println("2、销售人员:");
System.out.println("3、一般工人:");
System.out.println("4、结束支付工资");
System.out.println("请输入指令号:");
Scanner a=new Scanner(System.in);
try{int num=a.nextInt();
if(num==1){
System.out.println("经理姓名:");
Manager a1=new Manager(a.next());
puterSalary();
a1.show();
}
e lse i
f (num==2){
System.out.println("销售人员姓名和销售额:");
Salesman a2=new Salesman(a.next(),a.nextDouble());
puterSalary();
a2.show();
}
else i f(num==3){
System.out.println("是计件工人还是计时工人?");
System.out.println("1、计时2、计件,请选择:");
int p=a.nextInt();
if(p==1){
System.out.println("工人姓名和工作天数:");
DailyWorker a3=new DailyWorker(a.next(),a.nextInt());
puterSalary();
a3.show();}
if(p==2){
System.out.println("工人姓名和工作天数:");
PieceWorker a3=new PieceWorker(a.next(),a.nextInt());
puterSalary();
a3.show();}
}
else i f(num==4){
System.out.println("结束工资支付");
d=false;
}
else
System.out.println("输入错误");
}catch(java.util.InputMismatchException e){
System.out.println("输入错误");
}
}
}
}
运行结果:
请选择取工资的雇员类型:
1、经理
2、销售人员:
3、一般工人:
4、结束支付工资
请输入指令号:
3
是计件工人还是计时工人?
1、计时
2、计件,请选择:
1
工人姓名和工作天数:
张三
30
姓名张三工资3000.0
请选择取工资的雇员类型:
1、经理
2、销售人员:
3、一般工人:
4、结束支付工资
请输入指令号:
3题
//*****InterfaceOne类*****
public interface InterfaceOne {
double getArea( ); //获取面积的抽象方法
double getPerimeter( ); //获取周长的抽象方法
}
//*****SubClass类*****
public class SubClass extends SuperClass{
private InterfaceOne inner;
public SubClass( ){
}
public InterfaceOne inter ( ){
//该方法返回类型为InterfaceOne返回内部类InnerClass的对象实例
double b;
System.out.print("请输入边长:");
Scanner read = new Scanner(System.in);
b = read.nextDouble();
inner = new InnerClass(b); //创建内部类InnerClas的实例对象
return inner;
}
public String toString( ){
return inner.toString();
}
}
//*****SuperClass类*****
public class SuperClass {
//下面是受保护的内部类InnerClass的定义,它实现接口InterfaceOn
protected class InnerClass implements InterfaceOne{ private double a; //边长
public InnerClass( ){
}
public InnerClass(double a){ //构造方法
this.a = a;
}
public double getArea( ) { //获取面积的方法
return a*a;
}
public double getPerimeter( ){ //获取周长的方法
return 4*a;
}
public String toString( ){
return ("边长为" +a + "正方形");
}
}
}
//*****Test测试类*****
public class Test {
public static void main(String[] args) {
SubClass sc = new SubClass( );
InterfaceOne inter = sc.inter ( );
double area = inter.getArea();
double perimeter = inter.getPerimeter();
System.out.println(sc + "的面积为" +area);
System.out.println(sc + "的周长为" +perimeter);
}
}
运行结果:
请输入边长:3
边长为3.0正方形的面积为9.0
边长为3.0正方形的周长为12.0
六、实验过程中遇到的问题及解决手段:
刚开始对成员变量的隐藏与方法的重写以及接口的定义和实现方法不是很清楚,通过请教同学才慢慢明白其基本方法,还有就是对有些语句的用法不是很熟通过看课本加深了理解。
七、本次实验的体会(结论):
通过本次试验我掌握了类的继承机制,成员变量的隐藏与方法的重写以及接口的定义和实现方法,复习了类的继承以及接口的设计方法,对java的认识更深一步。