《Java程序设计》上机实验报告 实验三 面向对象程序设计的继承、多态等特性的练习

信息科学与工程学院 《Java程序设计》 上机实验报告

专业班级             姓    名           学    号                   

实验时间                   指导教师             成    绩               

 

第二篇:面向对象程序设计的继承、多态等特性的练习

一、实验名称

     面向对象程序设计的继承、多态等特性的练习

二、实验目的

1)      掌握类的继承机制。

2)      熟悉类中成员变量和方法的访问控制。

3)      熟悉方法或构造方法多态性。

4)      熟悉接口的定义方法。

三、实验记录

1.编写程序实现如下功能:已知Person类包含三个公共域变量(姓名、性别、年龄)和一个构造方法,Student类是Person类的派生类,包含两个新的公共域变量(学号、班号)、两个公共方法(构造方法、修改年龄、显示基本信息)和一个构造方法。定义一组学生对象,并初始化他们的基本信息,然后依次输出。
步骤(1):定义类Person,并添加以下公共域变量
         public  String name; public char sex; public int age;
         添加构造方法Person(String name,char sex,int age){……}
步骤(2):基于类Person派生类Student,并添加如下公共域变量和方法
         public  String classno;  public String sno;
         public  void updateAge(int age){……}
         void toString(){…  …}
         Student(String name,char sex,int age,String sno,String name)
         { super(name,sex,age);
            … ….
         }
步骤(3):定义一个包含main方法的Application程序类TestStudentPerson,初
          始化一个学生类对象数组,并利用循环语句显示所有学生基本信息。

源程序如下:

package pk2;

class Person{

    public String name;

    publicchar sex;

    publicint age;

    Person(String name,char sex,int age){

        this.name=name;

        this.sex=sex;

        this.age=age;

    }

}

class Student extends Person{

    public String classno,sno;

    publicvoid updateAge(int age){

        this.age=age;

    }

    public String toString(){

        System.out.println(name+"  "+sex+"    "+age+"  "+sno+"     "+classno);

                    return name+"  "+sex+"    "+age+"  "+sno+"     "+classno;

    }

    Student(String name,char sex,int age,String sno,String classno){

        super(name,sex,age);

         this.sno=sno;

         this.classno=classno;

    }

}

publicclass TestStudentPerson {

    publicstaticvoid main(String[] args)

    {Student s[]=new Student[3];

         s[0]=new Student("Jin",'M',20,"200904135146","电信0904");

         s[0].updateAge(21);

         s[1]=new Student("Liu",'M',20,"200904135147","电信0904");

         s[2]=new Student("Zhu",'M',20,"200904135148","电信0904");

    System.out.println("Name"+" "+"Sex"+"  "+"Age"+"   "+"Sno"+"            "+"Classno");

   for(int i=0;i<3;i++)

       s[i].toString();

    } 

}

运行结果如下:

2.输入课本例5-4的源程序,观察其运行结果,然后将Shape类分别定义为一个抽象类和接口,然后将源程序进行修改,让其实现相同功能。

步骤(1):在编辑调试工具中输入课本例5-4TestVirtualInvoke.java程序,编译运行,观察程序的运行结果,并思考为什么产生这样的结果。

步骤(2):将Shape类定义为abstact class Shape{……},然后重新定义Shape抽象类的派生类Circle、Triangle、Line,最后编译运行,观察程序的运行结果是否和上面的结果相同。

步骤(3):将Shape定义为interface Shape{……},然后基于Shape接口实现类Circle、Triangle、Line,最后编译运行,观察程序的运行结果是否和上面的结果相同。

方法一:

public class TestVirtualInvoke {

    static void doStuff(Shape s){

        s.draw();

    }

    public static void main(String[] args) {

        Circle c=new Circle();

        Triangle t=new Triangle();

        Line l=new Line();

        doStuff(c);

        doStuff(t);

        doStuff(l);

    }

}

 class Shape{

    void draw(){

        System.out.println("Shape Drawing");

    }

}

class Circle extends Shape{

    void draw(){

        System.out.println("Shape Circle");

    }

}

class Triangle extends Shape{

    void draw(){

        System.out.println("Shape Triangle");

    }

}

class Line extends Shape{

    void draw(){

        System.out.println("Shape Line");

    }

方法二:使用抽象类abstract

(此处略去public class TestVirtualInvoke{……} )

abstract class Shape{

    abstract void draw();

}  

class Circle extends Shape{

    void draw(){

        System.out.println("Shape Circle");

    }

}   //定义Shape抽象类的派生类Circle

class Triangle extends Shape{

    void draw(){

        System.out.println("Shape Triangle");

    }

}   //定义Shape抽象类的派生类Triangle

class Line extends Shape{

    void draw(){

        System.out.println("Shape Line");

    }

}     //定义Shape抽象类的派生类Line

方法三:使用interface接口方法

(此处略去public class TestVirtualInvoke{……} )

interface Shape{

    public void draw();

}   //定义一个Shape接口

class Circle implements Shape{

  public   void draw(){

        System.out.println("Shape Circle");

    }

}    //基于Shape接口利用implements实现类Circle

class Triangle implements Shape{

  public void draw(){

        System.out.println("Shape Triangle");

    }

}   //基于Shape接口利用implements实现类Triangle

class Line implements Shape{

   public  void draw(){

        System.out.println("Shape Line");

    }

}   //基于Shape接口利用implements实现类Line

 

3.某小型公司,主要有三类人员:经理、兼职技术人员和兼职推销员。
这三类人员共同拥有的相关属性:姓名、编号; 相关方法:获取当月薪水的getPay()方法、显示个人信息的toString()方法。
人员编号基数为1000,每创建一个人员实例对象,其编号属性的值顺序加1。月薪计算方法:经理拿固定月薪8000元;兼职技术人员按每小时100元领取月薪;兼职推销人员的月薪按当月的销售额的4%提成。

源程序如下:

 

abstractclass Worker           

    { String name;

      long no;

      staticlongid=1000;

      abstractpublicdouble getPay();

      Worker(String name){ this.name=name;id=id+1;}

     }

   

class Manager extends Worker 

    {  

        double pay=8000;

        publicdouble getPay(){return 8000;}

        Manager(String name)

        {super(name);no=id;}

        public String toString(){return "name:"+name+"  no:"+no+"  pay:8000"+"\n";}

     }

   

class Sale extends Worker      

    {   long saleNum;

        publicdouble getPay(){return saleNum*0.4;}

        Sale(String name,long saleNum)

            {super(name);

              no=id;

             this.saleNum=saleNum;

             }

        public String toString()

            {return  "name:"+name+"  no:"+no+"  pay:"+getPay()+"\n";}

    }

class Tech extends Worker      

    { long salaryHours;

     public  double getPay()

        {return salaryHours*100; }

      Tech(String name,long salaryHours)

        {super(name); no=id;

         this.salaryHours=salaryHours;}

      public String toString()  {return "name:"+name+"  no:"+no+"  pay:"+getPay()+"\n";}}

    publicclass TestWorker

   {staticdoublesum;

        publicstaticvoid main(String args[])

    {

            Worker a[]=new Worker[4];

     a[0]=new Sale("张三",2000);

     a[1]=new Sale("李四",6000);

     a[2]=new Tech("王五",100);

     a[3]=new Manager("钱七");

   //  String output="";

    for(int i=0;i<a.length;i++)

    //output+=a[i];

     System.out.println(a[i]);

     

     for(int i=0;i<a.length;i++)

         sum+=a[i].getPay();System.out.println("totalPay:"+sum);

    }

}

运行结果如下:

四、个人小结

      本次实验是编写三个java程序实现简单的功能,其中第二个实验要求用三种方法实现,包括使用抽象类和接口方法,实验是在java集成开发环境Myeclipse中完成的,在Myeclipse中完成java源程序的编辑、编译与运行。实验中遇到过很多问题,而Myeclipse能够较准确的指出错误并提出修改建议,在不断的修改后,终于使得所写的程序没有语法等错误,但在运行时却不能正常运行,经检查发现是创建的数组没有初始化,改正后程序正常运行出现正确的结果。

    通过这次上机,我对java面向对象的程序设计的概念有了进一步的认识,深化了对课本知识的了解与认识,对类与接口的理解更深刻,熟悉了类域的使用,父类子类运以及方法的继承覆盖运用更加娴熟,也学会了一些基本的编程方法与技巧,希望经过以后的上机来更好的掌握java。

相关推荐