馮誌霞201771010107《面向對象程序設計(java)》第四周學習總結
實驗四類與對象的定義及使用
實驗時間 2018-9-20
1、實驗目的與要求
(1) 理解用戶自定義類的定義;
(2) 掌握對象的聲明;
(3) 學會使用構造函數初始化對象;
(4) 使用類屬性與方法的使用掌握使用;
(5) 掌握package和import語句的用途。
學習總結如下:
類與對象的概念。
類:是構造對象的模板或藍圖。由類構造對象的過程稱為創建類的實例。
對象:想要使用oop,一定要清楚對象的三個特性:
1)對象的行為:對象的行為使用可調用的方法定義的。
·2)對象的狀態:每個對象都保存著描述當前特征的信息。
3)對象標識:如何辨明具有相同行為的相似性。
對象與對象變量的關系
Java中想使用對象就必須先構造對象,並指定其初始狀態。
通過實驗掌握了預定義類的基本使用方法,熟悉Math類、String類、math類、Scanner 類、LocalDate類的常用API。
1)對象與對象變量。
在Java語言中,使用構造器構造新實例。構造器是類中一個特殊的方法,生成並初始化對象,它的方法名與類名相同。
想要構造一個Data對象(定義在java.util中),需要在構造器前加上new操作符:new Data()
Data deadline;該語句錯誤。
可將一個對象變量設置為null,表示該對象變量未引用任何變量,如deadlin=null。
更改器與訪問器。
更改器:修改實例域。前綴set,更改當前類中的屬性。
訪問器:更改實例域。前綴get。
掌握用戶自定義類的語法規則,包括實例域、靜態域、構造器方法、更改器方法、訪問器方法、靜態方法、main方法、方法參數的定義要求
(1)實例域:可將實例域定義為final,構建對象時必須初始化這樣的域。
(2)靜態域:絕大多數面向對象程序設計語言中,靜態域被稱為類域。如果將域定義為static,每個類中只有一個這樣的域。而每個對象對於所有的實例域卻都有自己的一份拷貝。
(3)靜態方法:靜態方法是一種不能向對象實時操作的方法。可以使用對象調用靜態方法。
(4)構造器方法:構造器與類同名。構造器總是伴隨著new操作符的執行被調用,而不能對一個已經存在的對象調用構造器來達到重新設置實例域的目的。
(5)更改器方法:調用更改器方法後對象的狀態會改變。
(6)訪問器方法:只訪問對象而不修改對象的方法。
(7)main方法:main方法不對任何對象進行操作。靜態的main方法將執行並創建程序所需要的對象。
2、實驗內容和步驟
實驗1 測試以下程序,掌握文件輸入輸出程序設計技術(文件輸入輸出,教材61-62).
1 import java.io.*; 2 3 import java.util.*; 4 5 public class FileWriteReadTest { 6 7 public static void main(String[] args) throws IOException{ 8 9 //寫入文件演示 10 11 PrintWriter out = new PrintWriter("myfile.txt"); 12 13 out.println("姓名 高數 Java 數據結構 平均成績 總成績"); 14 15 out.println("張三 20 30 40 0 0"); 16 17 out.println("李四 50 60 70 0 0"); 18 19 out.close();//輸出完畢,需要close 20 21 //讀入文件演示 22 23 Scanner in = new Scanner(new File("myfile.txt"));//為myfile.txt這個File創建一個掃描器in 24 25 int number = 1;//行號 26 27 System.out.println(in.nextLine()); 28 29 while(in.hasNextLine()){//判斷掃描器是否還有下一行未讀取,該循環把文件的每一行都讀出 30 31 String line = in.nextLine();//讀出myfile.txt的下一行 32 33 System.out.print("第"+(++number)+"行的內容: "); 34 35 Scanner linescanner = new Scanner(line);//行內容建立掃描器 36 37 linescanner.useDelimiter(" ");//使用空格作為分隔符 38 39 String name = linescanner.next(); 40 41 String math = linescanner.next(); 42 43 String java = linescanner.next(); 44 45 String ds = linescanner.next(); 46 47 String avg = linescanner.next(); 48 49 String total = linescanner.next(); 50 51 System.out.println("name="+name+" math="+math+" java="+java+" ds="+ds+" avg"+avg+" total="+total); 52 53 } 54 55 in.close();//讀入完畢,最後需要對其進行close。 56 57 } 58 59 }
l 編輯、編譯、調試運行程序4-2(教材104頁);
測試程序1:實驗2 導入第4章示例程序並測試。
l 結合程序運行結果,掌握類的定義與類對象的用法,並在程序代碼中添加類與對象知識應用的註釋;
l 嘗試在項目中編輯兩個類文件(Employee.java、 EmployeeTest.java ),編譯並運行程序。
l 參考教材104頁EmployeeTest.java,設計StudentTest.java,定義Student類,包含name(姓名)、sex(性別)、javascore(java成績)三個字段,編寫程序,從鍵盤輸入學生人數,輸入學生信息,並按以下表頭輸出學生信息表:
姓名 性別 java成績
import java.time.*; /** * This program tests the Employee class. * * @version 1.12 2015-05-08 * @author Cay Horstmann */ public class EmployeeTest { public static void main(String[] args) { // 用三個Employee對象填充staff數組 Employee[] staff = new Employee[3]; staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15); staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15); //將每個人的工資提高5% for (Employee e : staff) e.raiseSalary(5); //打印出員工反對的信息 for (Employee e : staff) System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay=" + e.getHireDay()); } } class Employee { private String name; private double salary; private LocalDate hireDay; public Employee(String n, double s, int year, int month, int day) { name = n; salary = s; hireDay = LocalDate.of(year, month, day); } public String getName() { return name; } public double getSalary() { return salary; } public LocalDate getHireDay() { return hireDay; } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } }
/** * @version 1.10 1999-11-13 * @author Cay Horstmann */ public class Employee { private String name; private double salary; public native void raiseSalary(double byPercent); public Employee(String n, double s) { name = n; salary = s; } public void print() { System.out.println(name + " " + salary); } static { System.loadLibrary("Employee"); } }
import java.util.*; public class StudentTest { public static void main(String[] args) { Student[] staff = new Student[4]; System.out.println("請輸入學生姓名、性別、Java成績"); Scanner in = new Scanner(System.in); for(int i=0;i<staff.length;i++) { staff[i]=new Student(in.next(),in.next(),in.nextInt()); } System.out.println("name"+"sex"+"javascore"); for (Student e: staff) System.out.println(e.getName()+e.getSex()+e.getjavaScore()); } } class Student { private String name; private String sex; private int javascore; public Student(String n, String s, int j) { name = n; sex = s; javascore =j; } public String getName() { return name; } public String getSex() { return sex; } public int getjavaScore() { return javascore; } }
測試程序2:
l 編輯、編譯、調試運行程序4-3(教材116);
l 結合程序運行結果,理解程序代碼,掌握靜態域(netxtId)與靜態方法(getNextId)的用法,在相關代碼後添加註釋;
l 理解Java單元(類)測試的技巧。
/** /** * This program demonstrates static methods. * @version 1.01 2004-02-19 * @author Cay Horstmann */ public class StaticTest { public static void main(String[] args) { //用三個Employee對象填充staff數組 Employee[] staff = new Employee[3]; staff[0] = new Employee("Tom", 40000); staff[1] = new Employee("Dick", 60000); staff[2] = new Employee("Harry", 65000); //打印出員工反對的信息 for (Employee e : staff) { e.setId(); System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary()); } int n = Employee.getNextId(); // calls static method System.out.println("Next available id=" + n); } } class Employee { private static int nextId = 1; private String name; private double salary; private int id; public Employee(String n, double s) { name = n; salary = s; id = 0; } public String getName() { return name; } public double getSalary() { return salary; } public int getId() { return id; } public void setId() { id = nextId; //將此ID設置為下一個可用ID nextId++; } public static int getNextId() { return nextId; //返回static域 } public static void main(String[] args) // unit test { Employee e = new Employee("Harry", 50000); System.out.println(e.getName() + " " + e.getSalary()); } }
測試程序3:
l 編輯、編譯、調試運行程序4-4(教材121);
l 結合程序運行結果,理解程序代碼,掌握掌握Java方法參數的用法,在相關代碼後添加註釋;
/** * This program demonstrates parameter passing in Java. * @version 1.00 2000-01-27 * @author Cay Horstmann */ public class ParamTest { public static void main(String[] args) { //該方法不能修改數值參數 System.out.println("Testing tripleValue:"); double percent = 10; System.out.println("Before: percent=" + percent); tripleValue(percent); System.out.println("After: percent=" + percent); //該方法可以改變對象參數的狀態 System.out.println("\nTesting tripleSalary:"); Employee harry = new Employee("Harry", 50000); System.out.println("Before: salary=" + harry.getSalary()); tripleSalary(harry); System.out.println("After: salary=" + harry.getSalary()); //該方法可以將新對象附加到對象參數 System.out.println("\nTesting swap:"); Employee a = new Employee("Alice", 70000); Employee b = new Employee("Bob", 60000); System.out.println("Before: a=" + a.getName()); System.out.println("Before: b=" + b.getName()); swap(a, b); System.out.println("After: a=" + a.getName()); System.out.println("After: b=" + b.getName()); } public static void tripleValue(double x) // doesn‘t work { x = 3 * x; System.out.println("End of method: x=" + x); } public static void tripleSalary(Employee x) // works { x.raiseSalary(200); System.out.println("End of method: salary=" + x.getSalary()); } public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; System.out.println("End of method: x=" + x.getName()); System.out.println("End of method: y=" + y.getName()); } } class Employee { private String name; private double salary; public Employee(String n, double s) { name = n; salary = s; } public String getName() { return name; } public double getSalary() { return salary; } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } }
測試程序4:
l 編輯、編譯、調試運行程序4-5(教材129);
l 結合程序運行結果,理解程序代碼,掌握Java用戶自定義類的用法,掌握對象構造方法及對象使用方法,在相關代碼後添加註釋。
測試程序5:
l 編輯、編譯、調試運行程序4-6、4-7(教材135);
l 結合程序運行結果,理解程序代碼,掌握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) 將兩個對象的周長加總輸出,將兩個對象的面積加總輸出。
1 import java.util.Scanner; 2 3 public class Circlep2 { 4 float pai=(float) 3.14; 5 6 void yuan(float r){ 7 System.out.println("圓的面積是:"+r*r*pai); 8 System.out.println("圓的周長是:"+2*pai*r); 9 } 10 11 12 13 void juxing(float chang,float kuan){ 14 System.out.println("矩形的面積是:"+chang*kuan); 15 System.out.println("矩形的周長是:"+2*(chang+kuan)); 16 } 17 18 public static void main(String[] args) { 19 Circlep2 c2=new Circlep2(); 20 Scanner sc=new Scanner(System.in); 21 22 System.out.println("請輸入圓的半徑:"); 23 float r=sc.nextFloat(); 24 c2.yuan(r); 25 26 27 System.out.println("請輸入矩形的長:"); 28 float chang=sc.nextFloat(); 29 System.out.println("請輸入矩形的寬:"); 30 float kuan=sc.nextFloat(); 31 c2.juxing(chang, kuan); 32 33 } 34 }
總結:通過此次實驗我基本掌握了文件輸入輸出程序的設計技術,學到了類的定義與類對象的用法,且學會了如何定義一個student類其中包含三個字段。基本掌握了靜態域與靜態方法的用法,掌握Java方法參數的用法,還有Java用戶自定義類的用法,掌握對象構造方法及對象使用方法對Java中的類(如LocalDate類,Employee類Math類、String類、math類等)有了初步的了解,並初步掌握了用戶自定義的語法規則如包括實例域、靜態域、構造器方法、更改器方法、訪問器方法、靜態方法、main方法、方法參數的定義要求。但是最後一個實驗我還沒有很透徹的掌握以後會多多努力的
馮誌霞201771010107《面向對象程序設計(java)》第四周學習總結