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

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

posted @ 2018-09-25 18:54  只当梦醒  阅读(253)  评论(0编辑  收藏  举报