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

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

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

第一部分:理论知识

1.类与对象

a.类(class)是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例;

java中类声明的格式如下:

[类修饰符] class 类名 [extends 父类名称] [implements 接口名称列表] 

{

   变量定义及初始化;

   方法定义及方法体;

}

public:类的访问控制符。Java类具有两种访问访问修饰符:public和default。public允许类具有完全开放的可见性,所有其他类都可以访问它,省略public,则为default,即只有位于同一个包(本质上就是文件夹)中的类可以访问该类。

abstract指明该类为一个抽象类,说明该类是一个定义不完全的类,需要被继承,才能实例化创建对象。

 b.对象:即数据,对象有三个特性——1.行为 2.状态 3.标识。

c、方法,变量.

d.类是对象,事物的描述和抽象,是具有相同属性和行为的对象集合。对象则是该类事物的实例。    

2.预定义类 、API 

Math类、String类、math类、Scanner类、LocalDate类

3.自定义类

4.静态域和静态方法    绝大多数面向对象程序设计语言中,静态域被称为类域。如果将域定义为static,每个类中只有一个这样的域。而每个对象对于所有的实例域却都有自己的一份拷贝。

   构造器、更改器方法、访问器方法,静态方法

5.方法参数

6.包

7.文档注释技术

第二部分:实验部分

1、实验目的与要求

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

(2) 掌握对象的声明;

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

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

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

2、实验内容和步骤

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

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

测试结果截图如下:

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

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

测试程序1

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

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

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

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

  姓名      性别 java成绩

(1)源代码:

(2)Employee.java、 EmployeeTest.java 运行结果截图:

 1 import java.time.*;
 2 
 3 /**
 4  * This program tests the Employee class.
 5  * @version 1.12 2015-05-08
 6  * @author Cay Horstmann
 7  */
 8 public class EmployeeTest
 9 {
10    public static void main(String[] args)
11    {
12       // fill the staff array with three Employee objects
13       Employee[] staff = new Employee[3];
14 
15       staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);
16       staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
17       staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15);
18 
19       // raise everyone's salary by 5%
20       for (Employee e : staff)
21          e.raiseSalary(5);
22 
23       // print out information about all Employee objects
24       for (Employee e : staff)
25          System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
26                + e.getHireDay());
27    }
28 }
29 
30 class Employee
31 {
32    private String name;
33    private double salary;
34    private LocalDate hireDay;
35 
36    public Employee(String n, double s, int year, int month, int day)
37    {
38       name = n;
39       salary = s;
40       hireDay = LocalDate.of(year, month, day);
41    }
42 
43    public String getName()
44    {
45       return name;
46    }
47 
48    public double getSalary()
49    {
50       return salary;
51    }
52 
53    public LocalDate getHireDay()
54    {
55       return hireDay;
56    }
57 
58    public void raiseSalary(double byPercent)
59    {
60       double raise = salary * byPercent / 100;
61       salary += raise;
62    }
63 }

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

(3)EmployeeTest.java源代码及运行结果截图如下

 1 import java.time.LocalDate;
 2 import java.util.Scanner;
 3 /**
 4  * This program tests the Employee class.
 5  * @version 1.12 2018-09-25
 6  * @author yangxiaoxiao
 7  */
 8 public class StudentTest
 9 {
10     String name;
11     String sex;
12     double score;
13    public static void main(String[] args)
14     //public static void ScannerTest(){
15    {
16        
17        
18        int i = 0;
19         
20         System.out.print("numer:");
21         Scanner sc= new Scanner(System.in);
22        int number = sc.nextInt();
23        StudentTest Stu[] = new StudentTest[number];
24         for (i = 0; i < Stu.length; i++) {
25             Stu[i] = new StudentTest();
26             System.out.print( (i + 1)+" "+"姓名:" );
27             Stu[i].name = sc.next();
28             System.out.print( (i + 1)+" " +"性别:");
29             Stu[i].sex = sc.next();
30             System.out.print( (i + 1)+" " +"java成绩:");
31             Stu[i].score = sc.nextDouble();
32         }
33        
34       
35       System.out.println("	姓名	性别	成绩");
36         for (StudentTest StudentTest : Stu) {
37             System.out.println("	" + StudentTest.name+ "	" + StudentTest.sex + "	" + StudentTest.score);
38         }
39         
40         
41    }
42 }
43         
44         
45     

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

测试程序2:

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

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

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

 1 /**
 2  * This program demonstrates static methods.
 3  * @version 1.01 2004-02-19
 4  * @author Cay Horstmann
 5  */
 6 public class StaticTest
 7 {
 8    public static void main(String[] args)
 9    {
10       // fill the staff array with three Employee objects
11       Employee[] staff = new Employee[3];
12 
13       staff[0] = new Employee("Tom", 40000);
14       staff[1] = new Employee("Dick", 60000);
15       staff[2] = new Employee("Harry", 65000);
16 
17       // print out information about all Employee objects
18       for (Employee e : staff)
19       {
20          e.setId();
21          System.out.println("name=" + e.getName() + ",
22                + e.getSalary());
23       }
24 
25       int n = Employee.getNextId(); // calls static method
26       System.out.println("Next available > n);
27    }
28 }
29 
30 class Employee
31 {
32    private static int nextId = 1;
33 
34    private String name;
35    private double salary;
36    private int id;
37 
38    public Employee(String n, double s)
39    {
40       name = n;
41       salary = s;
42       id = 0;
43    }
44 
45    public String getName()
46    {
47       return name;
48    }
49 
50    public double getSalary()
51    {
52       return salary;
53    }
54 
55    public int getId()
56    {
57       return id;
58    }
59 
60    public void setId()
61    {
62       id = nextId; // set id to next available id
63       nextId++;
64    }
65 
66    public static int getNextId()
67    {
68       return nextId; // returns static field
69    }
70 
71    public static void main(String[] args) // unit test
72    {
73       Employee e = new Employee("Harry", 50000);
74       System.out.println(e.getName() + " " + e.getSalary());
75    }
76 }

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

测试程序

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

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

 1 /**
 2  * This program demonstrates parameter passing in Java.
 3  * @version 1.00 2000-01-27
 4  * @author Cay Horstmann
 5  */
 6 public class ParamTest
 7 {
 8    public static void main(String[] args)
 9    {
10       /*
11        * Test 1: Methods can't modify numeric parameters
12        */
13       System.out.println("Testing tripleValue:");
14       double percent = 10;
15       System.out.println("Before: percent=" + percent);
16       tripleValue(percent);
17       System.out.println("After: percent=" + percent);
18 
19       /*
20        * Test 2: Methods can change the state of object parameters
21        */
22       System.out.println("
Testing tripleSalary:");
23       Employee harry = new Employee("Harry", 50000);
24       System.out.println("Before: salary=" + harry.getSalary());
25       tripleSalary(harry);
26       System.out.println("After: salary=" + harry.getSalary());
27 
28       /*
29        * Test 3: Methods can't attach new objects to object parameters
30        */
31       System.out.println("
Testing swap:");
32       Employee a = new Employee("Alice", 70000);
33       Employee b = new Employee("Bob", 60000);
34       System.out.println("Before: a=" + a.getName());
35       System.out.println("Before: b=" + b.getName());
36       swap(a, b);
37       System.out.println("After: a=" + a.getName());
38       System.out.println("After: b=" + b.getName());
39    }
40 
41    public static void tripleValue(double x) // doesn't work
42    {
43       x = 3 * x;
44       System.out.println("End of method: x=" + x);
45    }
46 
47    public static void tripleSalary(Employee x) // works
48    {
49       x.raiseSalary(200);
50       System.out.println("End of method: salary=" + x.getSalary());
51    }
52 
53    public static void swap(Employee x, Employee y)
54    {
55       Employee temp = x;
56       x = y;
57       y = temp;
58       System.out.println("End of method: x=" + x.getName());
59       System.out.println("End of method: y=" + y.getName());
60    }
61 }
62 
63 class Employee // simplified Employee class
64 {
65    private String name;
66    private double salary;
67 
68    public Employee(String n, double s)
69    {
70       name = n;
71       salary = s;
72    }
73 
74    public String getName()
75    {
76       return name;
77    }
78 
79    public double getSalary()
80    {
81       return salary;
82    }
83 
84    public void raiseSalary(double byPercent)
85    {
86       double raise = salary * byPercent / 100;
87       salary += raise;
88    }
89 }

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

测试程序

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

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

 1 import java.util.*;
 2 
 3 /**
 4 * This program demonstrates object construction.
 5 * @version 1.01 2004-02-19
 6 * @author Cay Horstmann
 7 */
 8 public class ConstructorTest
 9 {
10 public static void main(String[] args)
11 {
12 // fill the staff array with three Employee objects
13 Employee[] staff = new Employee[3];
14 
15 staff[0] = new Employee("Harry", 40000);
16 staff[1] = new Employee(60000);
17 staff[2] = new Employee();
18 
19 // print out information about all Employee objects
20 for (Employee e : staff)
21 System.out.println("name=" + e.getName() + ",
22 + e.getSalary());
23 }
24 }
25 
26 class Employee
27 {
28 private static int nextId;
29 
30 private int id;
31 private String name = ""; // instance field initialization
32 private double salary;
33 
34 // static initialization block
35 static
36 {
37 Random generator = new Random();
38 // set nextId to a random number between 0 and 9999
39 nextId = generator.nextInt(10000);
40 }
41 
42 // object initialization block
43 {
44 id = nextId;
45 nextId++;
46 }
47 
48 // three overloaded constructors
49 public Employee(String n, double s)
50 {
51 name = n;
52 salary = s;
53 }
54 
55 public Employee(double s)
56 {
57 // calls the Employee(String, double) constructor
58 this("Employee #" + nextId, s);
59 }
60 
61 // the default constructor
62 public Employee()
63 {
64 // name initialized to ""--see above
65 // salary not explicitly set--initialized to 0
66 // id initialized in initialization block
67 }
68 
69 public String getName()
70 {
71 return name;
72 }
73 
74 public double getSalary()
75 {
76 return salary;
77 }
78 
79 public int getId()
80 {
81 return id;
82 }
83 }

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

测试程序5:

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

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

4-6 

 1 import com.horstmann.corejava.*;
 2 // the Employee class is defined in that package
 3 
 4 import static java.lang.System.*;
 5 
 6 /**
 7  * This program demonstrates the use of packages.
 8  * @version 1.11 2004-02-19
 9  * @author Cay Horstmann
10  */
11 public class PackageTest
12 {
13    public static void main(String[] args)
14    {
15       // because of the import statement, we don't have to use 
16       // com.horstmann.corejava.Employee here
17       Employee harry = new Employee("Harry Hacker", 50000, 1989, 10, 1);
18 
19       harry.raiseSalary(5);
20 
21       // because of the static import statement, we don't have to use System.out here
22       out.println("name=" + harry.getName() + ",salary=" + harry.getSalary());
23    }
24 }
 1 package com.horstmann.corejava;
 2 
 3 // the classes in this file are part of this package
 4 
 5 import java.time.*;
 6 
 7 // import statements come after the package statement
 8 
 9 /**
10  * @version 1.11 2015-05-08
11  * @author Cay Horstmann
12  */
13 public class Employee
14 {
15    private String name;
16    private double salary;
17    private LocalDate hireDay;
18 
19    public Employee(String name, double salary, int year, int month, int day)
20    {
21       this.name = name;
22       this.salary = salary;
23       hireDay = LocalDate.of(year, month, day);
24    }
25 
26    public String getName()
27    {
28       return name;
29    }
30 
31    public double getSalary()
32    {
33       return salary;
34    }
35 
36    public LocalDate getHireDay()
37    {
38       return hireDay;
39    }
40 
41    public void raiseSalary(double byPercent)
42    {
43       double raise = salary * byPercent / 100;
44       salary += raise;
45    }
46 }

实验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) 将两个对象的周长加总输出,将两个对象的面积加总输出。

 1 import java.util.*;
 2 
 3 public class Com {
 4      
 5     public static void main(String[] args) {
 6         
 7         Scanner in = new Scanner(System.in);
 8         System.out.println("输入长:"); 
 9         double  length = in.nextDouble();
10         System.out.println("输入宽:"); 
11         double  width = in.nextDouble();
12         System.out.println("输入半径:"); 
13         double  radius = in.nextDouble();
14         Rectangle a=new Rectangle(length,width);
15         Circle    b=new Circle(radius);
16         System.out.println("矩形周长:"+a.getPerimeter()+"矩形面积:"+a.getArea());
17         System.out.println("圆周长"+b.getPerimeter()+"圆面积:"+b.getArea());
18         double x = a.getPerimeter()+b.getPerimeter();
19         double  y = a.getArea()+b.getArea();
20         System.out.println("周长和:"+x+"面积和:"+y);
21     }
22 
23 }
24 
25 class Rectangle {
26     private double width;
27     private double length;
28     public Rectangle(double w,double l)
29     {
30         width=w;
31         length=l;
32     }
33     public double getPerimeter()
34     {
35         double Perimeter = (width+length)*2;
36         return Perimeter;
37     }
38     public double getArea()
39     {
40         double Area = width*length;
41         return Area;
42     }
43 }
44 
45 class Circle {
46 
47     private double radius;
48     double PI = 3.14;
49     public Circle(double r)
50     {
51         radius=r;
52     }
53     public double getPerimeter()
54     {
55         double Perimeter = 2*PI*radius;
56         return Perimeter;
57     }
58     public double getArea()
59     {
60         double Area = PI*radius*radius;
61         return Area;
62     }
63 }

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

第三部分:实验总结

   通过这个周的学习,学习了面向对象程序设计的一些基础知识,类、对象、对象的三个特征(行为、状态和标识),明确了创建类、构造和初始化对象的格式、以及熟悉预定义类API的使用。学学习了一些常用的类:Math类、String类、Scanner类、LocalDate类等。在课上课下的阅读程序中,以及编写程序时,有些疑惑,不清楚代码语句的作用和和如何去编写代码,看懂不等于会!