• 《面向对象程序设计(Java)》第四周学习总结


    实验四 类与对象的定义及使用

    实验时间 2018-9-20

    1、实验目的与要求

    (1) 理解用户自定义类的定义;

    (2) 掌握对象的声明;

    (3) 学会使用构造函数初始化对象;

    (4) 使用类属性与方法的使用掌握使用;

    (5) 掌握package和import语句的用途。

    2、实验内容和步骤

    实验1 测试以下程序,掌握文件输入输出程序设计技术(文件输入输出,教材61-62).

    import java.io.*;
    import java.util.*;
    public class FileWriteReadTest {
        public static void main(String[] args) throws IOException{
            //写入文件演示
            PrintWriter out = new PrintWriter("myfile.txt");
            out.println("姓名 高数 Java 数据结构 平均成绩 总成绩");
            out.println("张三 20 30 40 0 0");
            out.println("李四 50 60 70 0 0");
            out.close();//输出完毕,需要close
            //读入文件演示
            Scanner in = new Scanner(new File("myfile.txt"));//为myfile.txt这个File创建一个扫描器in
            int number = 1;//行号
            System.out.println(in.nextLine());
            while(in.hasNextLine()){//判断扫描器是否还有下一行未读取,该循环把文件的每一行都读出
                String line = in.nextLine();//读出myfile.txt的下一行
                System.out.print(""+(++number)+"行的内容: ");            
                Scanner linescanner = new Scanner(line);//行内容建立扫描器
                linescanner.useDelimiter(" ");//使用空格作为分隔符
                String name = linescanner.next();
                String math = linescanner.next();
                String java = linescanner.next();
                String ds = linescanner.next();
                String avg = linescanner.next();
                String total = linescanner.next();
                System.out.println("name="+name+"  math="+math+"  java="+java+"  ds="+ds+"  avg"+avg+"  total="+total);
            }
            in.close();//读入完毕,最后需要对其进行close。
        }    
    }

    插入程序显示的代码测试结果如下:

    以txt的形式输出保存:

    改变文件的保存地址,输出结果如下所示:

    实验2 导入第4章示例程序并测试。

    测试程序1

       编辑、编译、调试运行程序4-2(教材104页);

        结合程序运行结果,掌握类的定义与类对象的用法,并在程序代码中添加类与对象知识应用的注释;

       尝试在项目中编辑两个类文件(Employee.java、 EmployeeTest.java ),编译并运行程序。

       参考教材104页EmployeeTest.java,设计StudentTest.java,定义Student类,包含name(姓名)、sex(性别)、javascore(java成绩)三个字段,编写程序,从键盘输入学生人数,输入学生信息,并按以下表头输出学生信息表:

      姓名      性别 java成绩

    测试这个程序,所显示的结果如下所示:

    对程序改编的设计结果如下所示:

    原实例代码:

    import java.util.Scanner;
    
    /**
     * This program tests the Student class.
     * time 2018 9 22
     * @author Ma Xingde
     */
    public class EmployeeTest
    {
       public static void main(String[] args)
       {
          // fill the staff array with three Employee objects
          int x=2;
          Employee[] staff = new Employee[x];
          System.out.println("请输入学生的姓名");
         
          Scanner in = new Scanner(System.in); 
          for(int i=0;i<staff.length;i++) {
              staff[i]=new Employee(in.next(),in.next(),in.nextInt());
          }
          System.out.println("name"+" "+"sex"+" "+" "+"javascore");
    
          // print out information about all Employee objects
          for (Employee e : staff)
             System.out.println(e.getName() +"   "+e.getSex()+"        "+e.getJavaScore());
       }
    }
    
    class Employee
    {
       private String name;
       private String sex;
       private int javascore;
    
       public Employee(String n, String s, int m)
       {
          name = n;
          sex = s;
          javascore =m;
       }
    
       public String getName()
       {
          return name;
       }
    
       public String getSex()
       {
          return sex;
       }
    
       public int getJavaScore()
       {
          return javascore;
       }
    
    }

    改编后运行的结果如下图所示:

    测试程序2:

        编辑、编译、调试运行程序4-3(教材116);

       结合程序运行结果,理解程序代码,掌握静态域(netxtId)与静态方法(getNextId)的用法,在相关代码后添加注释;

       理解Java单元(类)测试的技巧。

     程序测试运行结果如下所示:

    静态域的使用方法:

        如果将域定义为static,每个类中只有这样的一个域。而每一个对象对于所有的实例域却都有自己的一个拷贝。每个雇员都有一个自己的id域,但这个类的所有实例将共享一个nextId域。但是,只有一个静态域nextid,即使没有一个雇员对象,静态域nextId也存在。它属于类,而不属于任何独立的对象。

    静态方法的用法:

         静态方法是一种不能想对象实施操作的方法。在下面两种情况下可以使用静态方法:

       (1)一个方法不予要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)

       (2)一个方法只需要访问类的静态域(例如:Employee.getNextId)

    测试程序3:

        编辑、编译、调试运行程序4-4(教材121);

       结合程序运行结果,理解程序代码,掌握掌握Java方法参数的用法,在相关代码后添加注释;

    测试的结果如下所示:

         理解程序代码:

        在这个程序测试当中,首先试图将一个值参数的值提高两倍,但是并没有成功,随后成功地将一个雇员的薪金提高了两倍。在这个方法结束之后,harry应用对象状态发生了变化。这是因为这个方法可以通过对象引用的拷贝修改所引用的对象状态。最后程序演示拉我swap失败的结果,可以明显的看出,最后变量x和y交换了,但是变量a和b没有收到影响。

    测试程序4:

        编辑、编译、调试运行程序4-5(教材129);

       结合程序运行结果,理解程序代码,掌握Java用户自定义类的用法,掌握对象构造方法及对象使用方法,在相关代码后添加注释。

       测试程序结果如下图所示:

     

    对程序的理解:

         在这个程序当中,用了Java的第三种初始化数据域的方法,称为初始化块。在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。在这个程序的25行开始,无论使用哪个构造器类对象,Id域都在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主题部分。

       在这个程序清单中展示了很多特性:重载构造器、用this(...)调用另一个构造器、无参数构造器、对象初始化块、静态初始化块、实例域初始化等。

    测试程序5:

          编辑、编译、调试运行程序4-6、4-7(教材135);

         结合程序运行结果,理解程序代码,掌握Java包的定义及用法,在相关代码后添加注释;

    导入程序的过程如下:

    程序测试结果如下: 

     程序分析:

         在这个程序当中介绍我们介绍了怎么使用类的导入,可以使用import语句导入一个特定的类火整个包,Import语句是一种应用包含在保重的类的简明描述,一旦使用了import语句,在使用类时,就不必写出包的全名了。而且在实验当中也有将类放入包中,就必须将包的名字放在源文件的开头,包中定义类的代码之前。如果没有在源文件中放置package语句,这个源文件中的类就被放置在一个默认包中。默认包是一个没有名字的包。再次之前,我们定义的所有类都在默认包中。

    实验3  

    编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,lengthCircle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

    求周长的方法public int getPerimeter()

    求面积的方法public int getArea()

    main方法中完成以下任务:

    (1) 输入1行长与宽,创建一个Rectangle对象;

    (2) 输入1行半径,创建一个Circle对象;

    (3) 将两个对象的周长加总输出,将两个对象的面积加总输出。

     程序的源代码如下:

    test.java代码:

    package graph;
    
    import java.math.BigDecimal;
    import java.util.Scanner;
    
    class test {
    public static void main(String[] args) {
    
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入长方形的长:");
    int length = sc.nextInt();
    System.out.println("请输入长方形的宽:");
    int width = sc.nextInt();
    System.out.print("请输入圆的半径-->");
    float radius=sc.nextFloat();
    
    graph x = new graph();
    
    x.setLength(length);
    x.setWidth(width);
    x.setRadius(radius);
    System.out.println("周长是:"+x.getPerimeter());
    System.out.println("面积是:"+x.getArea());
    System.out.println("圆的周长为-->"+x.getPerimeter(radius)+"
    "+"圆的面积为-->"+x.getArea(radius));
    BigDecimal bd1 = new BigDecimal(x.getPerimeter(radius));
    BigDecimal bd2 = new BigDecimal(x.getArea(radius));
    BigDecimal bd3 = new BigDecimal(x.getPerimeter());
    BigDecimal bd4 = new BigDecimal(x.getArea());
    BigDecimal bd5 = bd1.add(bd3);
    BigDecimal bd6 = bd2.add(bd4);
    bd5= bd5.setScale(2, BigDecimal.ROUND_HALF_UP);
    bd6= bd6.setScale(2, BigDecimal.ROUND_HALF_UP);
    System.out.println("周长和:"+bd5+"
    "+"面积和"+bd6);
    }
    }

    graph.java代码:

    package graph;
    
    import java.util.Scanner;
    import java.math.BigDecimal;
    
    class graph{
    private int length;
    private int width;
    float radius;
    
    public graph(){}
    
    public void setLength(int length) {
    this.length = length;
    }
    
    public void setWidth(int width) {
    this.width = width;
    }
    
    public int getPerimeter() {
    return (length + width) * 2;
    }
    
    public int getArea() {
    return length * width;
    }
    
    public void setRadius(float radius) {
        BigDecimal bd = new BigDecimal(radius);
        radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
    this.radius = radius;
    }
    
    public float getPerimeter(float radius){
        BigDecimal bd = new BigDecimal(radius);
        radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
    return (float) (radius*2*3.14);
    }
    
    public float getArea(float radius){
        BigDecimal bd = new BigDecimal(radius);
        radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
    return (float) (radius*radius*3.14);
    }
    }

    程序输出的结果如下图所示:

    实验总结:

            通过这个周的学习,我明白了用户自定义类是如何去定义的。在第三章我已经学习了如何设计复杂应用程序所需要的各种主力类,同是,这些类没有main方法,却有自己的实例域和实例方法。在学习了类之后,有学习了静态域和静态方法的用法,在这一届的学习过程当中,觉得颇有收获,觉得比较简单易懂,了解了静态域、静态常量、静态方法、工厂方法和main方法的概念,并通过实例程序去真正理解了这些概念。接着学习了对象构造,在这一节主要就学习了参数化,初始化块。最后又学习了包,虽然在之前已经解除了包这个概念,但在这一节有学习了新的概念,比如说类的导入、静态导入、将类放入包中。这些都是自己在自主学习,希望在以后老师的讲解过程中有更大的进步。

           在最后的做面积和周长的实验中对我来说还是有一定难度的,在请教了变成能力好的同学之后才解决了这个问题,希望以后会有进步吧。

  • 相关阅读:
    设计模式
    软件的架构与设计模式之经典架构模式简介
    Rose与PowerDesigner:两款建模工具的对比
    C#中Socket多线程编程实例 [转载]
    C#串口控制
    .NET反射、委托技术与设计模式
    求多个数的质因子
    求单个数的欧拉函数
    基本欧拉函数
    hdu 2157(矩阵的快速幂)
  • 原文地址:https://www.cnblogs.com/791683057mxd/p/9690259.html
Copyright © 2020-2023  润新知