• 《面向对象程序设计(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方法的概念,并通过实例程序去真正理解了这些概念。接着学习了对象构造,在这一节主要就学习了参数化,初始化块。最后又学习了包,虽然在之前已经解除了包这个概念,但在这一节有学习了新的概念,比如说类的导入、静态导入、将类放入包中。这些都是自己在自主学习,希望在以后老师的讲解过程中有更大的进步。

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

  • 相关阅读:
    PEnum_PackingCareType
    threejs vector3叉积
    Pset_ActionRequest
    Pset_ProjectOrderPurchaseOrder
    Pset_ProjectOrderWorkOrder
    PEnum_PriorityType
    IfcPermitTypeEnum
    Pset_ProjectOrderMoveOrder
    IfcConstructionMaterialResourceTypeEnum
    中国足球不是倒在了比分的输赢上而是倒在了没有拼搏精神和责任心上——要我说中国男足就是没救了
  • 原文地址:https://www.cnblogs.com/791683057mxd/p/9690259.html
Copyright © 2020-2023  润新知