王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结 实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

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

实验时间 2018-9-20

1、目的与要求

学习目标

  1. 掌握类与对象的基础概念,理解类与对象的关系;
  2. 掌握对象与对象变量的关系;
  3. 掌握预定义类的基本使用方法,熟悉Math类、String类、math类、Scanner类、LocalDate类的常用API;
  4. 掌握用户自定义类的语法规则,包括实例域、静态域、构造器方法、更改器方法、访问器方法、静态方法、main方法、方法参数的定义要求;(重点、难点)
  5. 掌握对象的构造方法、定义方法及使用要求;(重点)
  6. 理解重载概念及用法;
  7. 掌握包的概念及用法;
  8. 了解文档注释技术;

A. 理论学习部分目的与要求

(1)面向对象程序设计(OOP)的概论

a.

类是构造对象的模板或蓝图;

b.对象

要想使用OOP,一定要清楚对象的三个特征:

①对象的行为②对象的状态③对象标识

c.识别类

d.类之间的关系

(2)使用预定义类

对象与对象标识;

Java类库中的LocalDate类;

更改器方法与访问器方法;

3)用户自定义类;

4)静态域与静态方法;

5)方法参数

6)对象构造

7)包

8)类路径

9)文档注释

10)类设计技巧

B. 实验学习部分目的与要求

(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

}

}

实验结果:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

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

日历程序:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

测试程序1

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

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

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

实验结果:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

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

  姓名      性别 java成绩

改编的程序:

package shiyan2;

import java.util.Scanner;

/**
 * This program tests the Student class.
 * time 2018 9 20
 * @author Wang yingqi
 */
public class shiyan1
{
   public static void main(String[] args)
   {
      // 填入四个学生的信息
      int x=4;
      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");

      // 输出四个学生的信息
      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;
   }

}

运行结果:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

测试程序2

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

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

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

实验结果:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

测试程序3

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

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

实验结果:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

测试程序4

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

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

实验结果:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

测试程序5

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

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

包的放法:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

实验结果:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性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类和tuxing类:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

Test类的代码:

package tuxing;

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();

tuxing x = new tuxing();

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);
}
}

tuxing类的代码:

package tuxing;

import java.util.Scanner;
import java.math.BigDecimal;

class tuxing{
private int length;
private int width;
float radius;

public tuxing(){}

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);
}
}

运行结果:

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

注:为了解决float和double型的精确度问题(如图所示),需要使用BigDecimal的方法,使关于圆的周长和面积输出能够以正确的精度和数值输出。

王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结
实验3  编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:

结:

通过这个周的学习,我明白了面向对象程序设计(OOP)的概论,认识了什么是类,什么是对象,并了解了对象的三个特征:对象的行为,对象的状态,对象标识;另外,我初步的掌握了如何使用预定义类,学会了如何构造并初始化对象。通过课上学习Java类库中的LocalDate类,以及CalendarTest的程序实验代码,加深了我对类的认识。在课下的学习中,我略微自学了用户自定义类的内容,并测试运行了示例程序,初步学习完了后面的内容。在学习过程中,我理解了学习Java必须要学会自己读懂程序,并在不断的练习中转化成自己的知识。