当前位置:文档之家› 面向对象--类继承与接口实验报告

面向对象--类继承与接口实验报告

实验十类继承与接口(二)课程名称:面向对象程序设计实验项目名称:实验十类继承与接口(二)学生姓名:专业:学号:实验地点:实验日期:年月【实验目的】1.掌握Java类的继承特点,包括子类声明、对象创建2. 掌握域的继承与隐藏的特点和用法3. 掌握方法的继承与重写的特点和用法【实验内容】一. 改错题检查下面代码是否有错,如果有错,写明错误原因,并修正错误。

(1)class Aaa{int i;Aaa(){i=-1; }Aaa(int a){ i = a;}Aaa(double d){Aaa((int)d);}}是否出错:是出错原因(如果出错):构造器调用构造器不能直接用名class Aaa{int i;Aaa(){i=-1; }Aaa(int a){ i = a;}Aaa(double d){this((int)d);}}(2)class Aaa{int i;Aaa(){i=-1; }Aaa(int a){ i = a;}Aaa(double a){int b=(int)a;this(b);}}是否出错:是出错原因(如果出错):this放第一行class Aaa{int i;Aaa(){i=-1; }Aaa(int a){ i = a;}Aaa(double a){this((int)a);}}(3)class Aaa{int i;Aaa(int a){ i = a;}}class Bbb extends Aaa{Bbb(){ }}是否出错:是出错原因(如果出错):父类没有无参构造,子类中药通过super调用父类构造class Aaa{int i;Aaa(int a){ i = a;}}class Bbb extends Aaa{Bbb(int a) {super(a);}}(4)class Aaa{private int i;protected int j;}class Bbb extends Aaa{Bbb(){i = 10;j = 99;}}是否出错:是出错原因(如果出错):private只能在自己的类中使用class Aaa{protected int i;protected int j;}class Bbb extends Aaa{Bbb(){i = 10;j = 99;}}(5)编译下面程序,程序是否出错class A{int i =100;}class B extends A{int i =10000;public static void main(String[] args){a)是否出错:是b)出错原因(如果出错):不能在静态方法使用this superclass A{int i =100;}class B extends A{int i =10000;public void main(String[] args){}}c)如果将上述类B的int i =10000改为static int i =10000;类A的int i =100改为staticint i =100;程序是否出错?是出错原因(如果出错):不能在静态方法使用this superclass A{int i =100;}class B extends A{int i =10000;public void main(String[] args){}}d)如果将类B的main方法改为public static void main(String[] args){B b =new B();}程序是否出错? 是出错原因(如果出错):不能强制将in类型改为A如果没出错, 给出结果:上面的的含义:的含义:(6)class Aaa{int i;public void Aaa(int a){ i=a;}public static void main(String[] args){Aaa a = new Aaa(10);}}是否出错:是出错原因(如果出错):构造器没有返回class Aaa{int i;public Aaa(int a){ i=a;}public static void main(String[] args){Aaa a = new Aaa(10);}}(7)class Aaa{public static void main(String[] args){int[][] a=new int[5][];for( int i=0;i<;i++)for(int j=0;i<a[i].length;j++){a[i][j]= (int)(100*());}}}是否出错:出错原因(如果出错):for(int j=0;i<a[i].length;j++)出现无限循环class Aaa{public static void main(String[] args){int[][] a=new int[5][5];for( int i=0;i<;i++)for(int j=0;j<a[i].length;j++){a[i][j]= (int)(100*());}}}(8)class A{int abc(int i){return 1;} 程序分析设计题下面各个设计要放在各自的包中。

1. 最初设计最初设计的所有类都放到first包中(1)员工类的设计假设公司有三种类型的员工:经理(manager),高级工(advanced worker),普通工人(normal worker)。

先分别设计描述这三种类型工人的类,要求如下:三个类的名称分别为Manager,AdvancedWorker,NormalWorker;每个类都有name(姓名),id(工号),age(年龄),workingAge(工龄)等private 类型的实例变量,而每个实例变量都有public类型的get和set方法。

每个类都要定义构造器,包括无参数构造器和至少一个有参数构造器(用于对实例变量赋初值)每个类都要定义一个public型的salary方法,用于计算员工对象的每月薪水,并返回计算结果,工资计算逻辑是:底薪+工龄工资。

比如,经理的底薪是20000,另外根据工龄每年加200元;高级工的底薪是10000元,另加每年100元的工龄工资;普通员工的底薪是8000,另加每年80元的工龄工资。

其余功能可以自行考虑public class Manager{改进设计:利用类的基础和上转型重新设计现在对前面的最初设计进行改造。

本次所有类都放到second包中。

(1)设计员工类的继承结构前面的最初设计中,一个主要的缺点就是代码重复,就是三种类型的员工类有许多重复的代码,这时可以通过设计继承结构,将这些重复代码放到超类中,缓解代码重复问题。

要求设计如下:设计一个Worker类,该类描述员工,作为经理(manager),高级工(advanced worker),普通工人(normal worker)的共同的超类。

Worker类提供子类的公共功能,即将子类的重复代码或类似代码移到Worker类中。

比如,:Worker类需要定义name(姓名),id(工号),age(年龄),workingAge(工龄)等private类型的实例变量,而每个实例变量都有public类型的get和set方法。

Worker类定义两个构造器,包括无参数构造器和一个有参数构造器(用于对四个实例变量赋初值)Worker类定义一个public型的salary方法,用于计算员工对象的每月薪水,具体代码在将来的子类中重定义(现在只需要返回0)。

三个子类Manager、AdvancedWorker、NormalWorker从Worker类继承,要求:每个子类定义各自的构造器,要求同最初设计,注意通过构造器调用链重用超类构造器的代码(即通过super调用超类构造器)每个类都各自重定义Worker类的salary方法,用于计算员工对象的每月薪水,具体计算逻辑(与最初设计相同):底薪+工龄工资。

比如,经理的底薪是20000,另外根据工龄每年加200元;高级工的底薪是10000元,另加每年100元的工龄工资;普通员工的底薪是8000,另加每年80元的工龄工资。

其余功能可以自行考虑public class Worker{改进设计:将超类设计为抽象类现在对前面的改进设计进行改造。

本次所有类都放到third包中。

前面设计的一个缺陷是:超类Worker类的salary方法不是抽象方法,并给我出了一个没有意义的代码,这样就无法强迫子类重定义这个salary方法。

为了避免这种情况,需要将Worker类的salary方法定义为抽象方法,而将Worker类定义为抽象类。

其余要求不变,编译通过,正常运行测试类代码。

实验报告要求将编程题源程序、运行结果,以及实验中遇到的问题和解决问题的方法,写在实验报告上。

package first;public class AdvancedWorker {private String name;private String id;private int age;private int workingAge;public AdvancedWorker(){}public AdvancedWorker(String name,String id,int age,int workingAge){ =name;=id;=age;=workingAge;}public void setName(String name){=name;}public String getName(){return name;}public void setId(String id){=id;}public String getId(){return id;}public void setAge(int age){=age;}public int getAge(){return age;}public void setWorkingAge(int workingAge){=workingAge;}public int getWorkingAge(){return workingAge;}public double salary(){return 10000+100*workingAge;}}package first;public class Company{alary();}alary();}alary();}alary();return sum;}}package second;public class Manager extends Worker {public Manager(String name,String id,int age, int workingAge){ super(name,id,age,workingAge);}public Manager(){}public double salary(){return 20000+200*getWorkingAge();}}package second;public class NormalWorker extends Worker {public NormalWorker(String name,String id,int age, int workingAge){ super(name,id,age,workingAge);}public NormalWorker(){}public double salary(){return 8000+80*getWorkingAge();}}package second;public class Test{public static void main(String[] args){Worker[] workers = new Worker[14];//员工数量共14个//下面示例两行代码手工创建Manager对象,并分别对managers的两个元素赋值workers [0]= new Manager("王一","001",30, 10);//创建子类Manager对象,并转型为超类workers [1] = new Manager("张二","002",40, 15);//含义同上//参考上述代码,用4行代码分别创建AdvancedWorker对象,并赋值给workers的元素 workers [0]= new AdvancedWorker("0","0",30, 10);workers [1]= new AdvancedWorker("1","1",30, 10);workers [2]= new AdvancedWorker("2","2",30, 10);workers [3]= new AdvancedWorker("3","3",30, 10);//参考上述代码,用8行代码分别创建NormalWorker对象,并赋值给workers的元素workers [0]= new NormalWorker("0","0",30, 10);workers [1]= new NormalWorker("1","1",30, 10);workers [2]= new NormalWorker("2","2",30, 10);workers [3]= new NormalWorker("3","3",30, 10);workers [4]= new NormalWorker("4","4",30, 10);workers [5]= new NormalWorker("5","5",30, 10);workers [6]= new NormalWorker("6","6",30, 10);workers [7]= new NormalWorker("7","7",30, 10);//将上述三个员工对象作为参数传递到Company对象内部。

相关主题