項目java |
內容數據庫 |
這個做業屬於哪一個課程編程 |
<任課教師博客主頁連接>https://www.cnblogs.com/nwnu-daizh/數組 |
這個做業的要求在哪裏dom |
<做業連接地址>https://www.cnblogs.com/ws-t/ide |
做業學習目標函數 |
掌握類與對象的基礎概念,理解類與對象的關係;oop 掌握對象與對象變量的關係;學習 掌握預約義類Date、LocalDate類的經常使用API;測試 掌握用戶自定義類的語法規則,包括實例域、靜態域、構造器方法、更改器方法、訪問器方法、靜態方法、main方法、方法參數的定義要求; 掌握對象的構造方法、定義方法及使用要求;(重點); 理解重載概念及用法; 掌握包的概念及用法;
|
第一部分:總結第四章理論知識
一、面向對象程序設計概述:面向對象程序設計(OOP)是一種新的程序設計思惟,這種方法更接近人類處理現實世界問題的天然表示方法。
(1)對象是面向對象編程的核心,是具體實體,具備明肯定義的狀態和行爲。
(2)對象的三個主要特徵:
1)行爲:能夠對對象施加哪些操做或者可使用哪些方法;
2)狀態:當施加那些操做或者方法時,對象應該如何應對;
3)標識:如何辨別具備相同行爲和狀態的不一樣對象。
二、類(class)
(1)類是具備相同屬性和行爲的一組對象的集合;
(2)類是描述對象的模板,它定義一類對象所擁有的數據和能完成的操做,在面向對象的程序設計中,類是構造程序的基本單位;
(3)每一個類由一組結構化的數據(稱做實例域)和在其上的一組操做構成。
三、如何識別類:
(1)過程化程序設計,必須從頂部的main函數開始編寫程序;
(2)oop的思路,首先從設計類開始,而後在每一個類裏面添加方法;
(3)識別類簡單規則是在問題分析過程當中尋找名詞,而類的方法則對應動詞。
四、類和對象的關係:
(1)類是對象的原型,對象是類的實例,類是同類對象的抽象;
(2)全部屬於同一個類的對象都具備相同的特徵和操做。
五、類之間的關係:
(1) 依賴:若是一個類中的方法操做了另外一個類的對象,那麼這個類就依賴於另外一個類;
(2)聚合:類A的對象包含類B的對象;
(3)繼承:表示一個特定類和一個 通常類之間的關係。
通常來講, 若是類A繼承了類B,那麼類A 不只有類B的方法與狀態,還有屬於本身的 狀態與方法。
六、表達類關係的UML符號:
七、預約義類的使用:
(1)已學過的預約義類:Math類、math類、String類、Scanner類;
(2)要使用預約義類的方法,只需知道方法名和參數便可,無需瞭解它的內在實現過程;
(3)使用預約義類須要在程序開始處用import命令導入該類所在的包路經。
八、對象與對象變量:
(1)在oop中,要想使用對象,就必須首先構造對象,並初始化對象的狀態,而後經過對象調用類中的方法;
(2)Java中,用構造器構造並初始化對象;
(3)構造器是類中一個特殊的方法,該方法與類名相同。不須要提供返回值;
(4)構造並初始化對象的格式:
new 構造器名(參數)
九、對象的初始化實例:
(1)Date類,定義在Java標準類庫的Java.util包中;
(2)初始化Date類對象的實例:
new Date();
System.out.println(new Date());
(3)能夠在類中一個方法用於新建立的對象:String s = new Date().toString();
十、對象變量:
(1)若是要屢次使用初始化的變量,可將初始化後的變量放在一個對象變量中;
格式: Date birthday = new Date();
(2)對象變量保存對象後,可用對象變量引用對象;
System.out.println(birthday.toString());
(3)可將一個對象變量設置爲NULL,表示該對象變量未引用任何對象。
十一、更改器方法和訪問器方法:
(1)一個類中對實例域進行修改的方法,更改器前面加set;
(2)一個類中對實例域進行訪問的方法,前綴get。
十二、用戶自定義類:
(1)類的定義包括兩部份內容:聲明和類體
(2)類體由兩部分構成:
一爲實體域(或成員變量)定義;二爲方法定義。
(3)域的定義:
1)實例域:類定義時實例域部分所定義的變量;
2)局部變量:方法體中定義的變量和方法的參數;
3)實例域的隱藏性:局部變量與實例域名字相同時,則實例域被隱藏,即在這個方法內暫時失效。
4)實例域的有效性:在整個類內部有效,而局部變量只在定義它的方法內有效。
5)私有實例域的更改器和訪問器:有時須要得到或設置私有實例域的值,此時需提供下面三項內容:
a)一個私有的數據庫;
b)一個共有的域訪問器方法;
c)一個共有的域訪問器方法;
6)final實例域:
能夠將實例域定義爲final,此類域構建對象時時必須進行初始化;即必須確保在構造器執行以前,這個域的值被設置,而且在後面的操做中,不能再對它的值進行修改,即該域無修改器。
final修飾符多用於基本數據類型域,或不可變類的域;
7)方法定義:
a)包括方法聲明和方法體;
b)方法的聲明:名字,類型和參數等屬性的說明:方法的類型描述的數返回值類型;
c)方法體由局部變量和Java語句構成;一個類中能夠有多個方法具備相同的名字,不一樣的類型,不一樣的參數,這種狀況叫重載;
1三、構造器:用來構造並初始化對象。
(1)構造器的名字必需要與它所在類名字相同;
(2)每一個包能夠由一個以上的構造器;
(3)構造器能夠由一個,一個以上的參數;
(4)構造器沒有返回值;
(5)構造器老是被new運算符調用;
1四、(1)靜態域:絕大多數面向對象程序設計語言中,靜態域被稱爲類域。
若是將域定義爲static,每一個類中只有一個這樣的域。而每一個對象對於全部的實例域卻都有本身的一份拷貝。
(2)main方法:main方法不對任何對象進行操做。靜態的main方法將執行並建立程序所須要的對象。
(3)靜態常量:靜態變量用的少,可是靜態常量用的多。
(4).靜態方法:用修飾的方法叫靜態方法或類方法,靜態方法可經過類名或對象來調用,而其餘方法只能經過對象來調用。靜態方法不能操做對象,不能在靜態方法中訪問實例域。但靜態方法能夠訪問自身類中的靜態域。能夠認爲靜態方法是沒有this參數的方法,而在一個非靜態方法中,this參數是表示這個對象/對象構造器的隱式參數。
1五、對象的定義:使用一個類建立一個對象時,即建立了一個類的實例域。只有經過對象才能夠訪問該域的公共實例域,調用類中共有的方法;
1六、類的導入:一個類能夠直接使用它所在的包中的全部類,也可使用來自其餘包中的全部public類。
(1)靜態導入:import語句不只能夠導入類,還增長了靜態導入方法和靜態域的功能;
(2)將類放如包中:首先用package語句指明報的名字,且該語句應爲程序的第一條語句,而後纔是定義類的語句;
(3)若是源文件不使用package語句指明包名,源文件的類將屬於默認包。
(4)當一個源文件中使用了package語句時,那麼這個包中全部的類文件的都必須放在與包名相匹配的目錄中;
(5)當程序中所使用的類位於不一樣包時,起源問價和類文件必須以下組織;
1七、包做用域:
(1)類中標記爲public的部分能夠被任意類使用;
(2)類中標記爲private的部分只能在類中使用;
(3)若是沒有爲類、方法或實例域指定訪問控制修飾符public或private,這部分能夠被同一包中的全部方法訪問;
(4)若是實例域不標記爲private,將默認爲包可見,這樣作會破壞類的封裝性。
1八、類路徑:
(1)類存儲在文件系統的子目錄中,類得路徑必須與包名匹配;
(2)在命令行方式下,設置類路徑,使用-classpath選項指定類路徑。
第二部分:實驗部分
實驗名稱:實驗三 類與對象的定義及使用
1. 實驗目的:
(1) 熟悉PTA平臺線上測試環境;
(2) 理解用戶自定義類的定義;
(3) 掌握對象的聲明;
(4) 學會使用構造函數初始化對象;
(5) 使用類屬性與方法的使用掌握使用;
(6) 掌握package和import語句的用途。
3. 實驗步驟與內容:
實驗1
採用我的帳號登陸https://pintia.cn/,使用綁定碼620781加入PTA平臺NWNU-2019CST1教學班(西北師範大學 計算機科學與工程學院 2018級計算機科學與技術),完成《2019秋季西北師範大學面向對象程序設計程序設計能力測試1》,測試時間50分鐘。
實驗1.1
公民身份證號碼按照GB11643—1999《公民身份證號碼》國家標準編制,由18位數字組成:前6位爲行政區劃分代碼,第7位至14位爲出生日期碼,第15位至17位爲順序碼,第18位爲校驗碼。從鍵盤輸入1個身份證號,將身份證號的年月日抽取出來,按年-月-日格式輸出。注意:輸入使用Scanner類的nextLine()方法,以避免出錯。
輸入樣例:
34080019810819327X
輸出樣例:
1981-08-19
程序代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.util.Scanner; public class test1 {
public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); System.out.println("please input your ID:"); String s1 = in.nextLine(); String s2,s3,s4; s2 = s1.substring(6, 10); s3 =s1.substring(10, 12); s4 = s1.substring(12, 14); System.out.println(s2+"-"+s3+"-"+s4); } } |
運行結果如圖:
實驗1.2
studentfile.txt文件內容是某班同窗的學號與姓名,利用此文件編制一個程序,將studentfile.txt文件的信息讀入到內存,並提供兩類查詢功能:(1)輸入姓名查詢學號;(2)輸入學號查詢姓名。要求程序具備友好人機交互界面。
編程建議:
(1)從文件中讀入學生信息,能夠編寫以下函數:
public static void StudentsFromFile(String fileName))
(2)輸入姓名查找學生學號,能夠編寫以下函數:
public static String findStudent(String name)
(3)輸入學號查找學生姓名,能夠編寫以下函數:
public static String findStudent(String ID)
程序代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;
public class Main { // private static Student students[];
private static ArrayList<Student> list;
public static void main(String[] args) { list = new ArrayList<>(); Scanner in = new Scanner(System.in); try { readFile("studentfile.txt"); System.out.println("請選擇操做,1按姓名,2按學號,3退出"); int i; while ((i = in.nextInt()) != 3) { switch (i) { case 1: System.out.println("請輸入姓名"); String name = in.next(); Student student = findStudentByName(name); if (student == null) { System.out.println("沒找到"); } else { System.out.println(student.toString()); } System.out.println("請選擇操做,1按姓名,2按學號,3退出"); break; case 2: System.out.println("請輸入學號"); String id = in.next(); Student student1 = findStudentById(id); if (student1 == null) { System.out.println("沒找到"); } else { System.out.println(student1.toString());
} System.out.println("請選擇操做,1按姓名,2按學號,3退出"); break;
default: System.out.println("輸入有誤"); System.out.println("請選擇操做,1按姓名,2按學號,3退出"); break; }
} } catch (IOException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); }finally { in.close(); }
}
public static void readFile(String path) throws IOException { FileReader reader = new FileReader(path); BufferedReader br = new BufferedReader(reader); String result; while ((result = br.readLine()) != null) { Student student = new Student(); student.setName(result.substring(13)); student.setID(result.substring(0,12)); list.add(student); } br.close(); }
public static Student findStudentByName(String name) { for (Student student : list) { if (student.getName().equals(name)) { return student; } } return null;
}
public static Student findStudentById(String Id) { for (Student student : list) { if (student.getID().equals(Id)) { return student; } } return null;
} }
class Student { private String name; private String ID;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getID() { return ID; }
public void setID(String iD) { ID = iD; }
@Override public String toString() { // TODO 自動生成的方法存根 return "姓名是:" + name + "學號是:" + ID; } } |
運行結果以下:
實驗2 導入第4章示例程序並測試。
測試程序1:
編輯、編譯、調試運行程序4-2(教材104頁);
結合程序運行結果,掌握類的定義與類對象的用法,並在程序代碼中添加類與對象知識應用的註釋;
嘗試在項目中編輯兩個類文件(Employee.java、 EmployeeTest.java ),編譯並運行程序。
參考教材104頁EmployeeTest.java,設計StudentTest.java,定義Student類,包含name(姓名)、sex(性別)、javascore(java成績)三個字段,編寫程序,從鍵盤輸入學生人數,輸入學生信息,並按如下表頭輸出學生信息表:
姓名 性別 java成績
實驗2 測試程序1(10分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import
java.time.*;
/**
* This program tests the Employee class.
* @version 1.13 2018-04-10
* @author Cay Horstmann
*/
public
class
EmployeeTest
//帶有public修飾的EmployeeTest類,其包含了main方法
{
public
static
void
main(String[] args)
{
// fill the staff array with three Employee objects
Employee[] staff =
new
Employee[
3
];
//構造了一個Employee數組,並填入了三個僱員對象
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
);
// raise everyone's salary by 5%
for
(Employee e : staff)
//利用Employee類的raiseSalary方法將每一個僱員的薪水提升5%
e.raiseSalary(
5
);
// print out information about all Employee objects
for
(Employee e : staff)
System.out.println(
"name="
+ e.getName() +
",salary="
+ e.getSalary() +
",hireDay="
+ e.getHireDay());
//調用getName方法、getSalary方法以及getHireDay方法將每一個僱員的信息打印出來
}
}
class
Employee
//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;
}
}
|
運行結果以下:
(2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
import
java.time.LocalDate;
public
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()
//實例域name的訪問器方法
{
return
name;
}
public
double
getSalary()
//實例域Salary的訪問器方法
{
return
salary;
}
public
LocalDate getHireDay()
////實例域HireDay的訪問器方法
{
return
hireDay;
}
public
void
raiseSalary(
double
byPercent)
{
double
raise = salary * byPercent /
100
;
salary += raise;
}
}
|
運行結果以下:
(3)代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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
);
// raise everyone's salary by 5% 給每人漲5%的工資
for
(Employee e : staff)
//進行foreach循環
e.raiseSalary(
5
);
// print out information about all Employee objects
for
(Employee e : staff)
System.out.println(
"name="
+ e.getName() +
",salary="
+ e.getSalary() +
",hireDay="
+ e.getHireDay());
}
}
|
運行結果以下:
l 參考教材104頁EmployeeTest.java,設計StudentTest.java,定義Student類,包含name(姓名)、sex(性別)、javascore(java成績)三個字段,編寫程序,從鍵盤輸入學生人數,輸入學生信息,並按如下表頭輸出學生信息表:
姓名 性別 java成績
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public
class
StudentTest {
public
static
void
main(String[] args) {
// TODO Auto-generated method stub
Student[] staff =
new
Student[
3
];
//構造了一個Employee數組,並填入了三個僱員對象
staff[
0
] =
new
Student(
"lulanxi"
,
"female"
,
99
);
staff[
1
] =
new
Student(
"luhaonan"
,
"male"
,
98
);
staff[
2
] =
new
Student(
"luyuxuan"
,
"male"
,
97
);
for
(Student e : staff)
System.out.println(
"name="
+ e.getName() +
",sex="
+ e.getSex() +
",javascore="
+ e.getJavascore());
//調用getName方法、getSex方法以及getJavascore法將每一個僱員的信息打印出來
}
}
class
Student
//Employee類
{
private
String name;
//三個僱員對象的私有實例域
private
String sex;
private
int
javascore;
public
Student(String n, String s,
int
score)
{
name = n;
sex = s;
javascore = score;
}
public
String getName()
{
return
name;
}
public
String getSex()
{
return
sex;
}
public
int
getJavascore()
{
return
javascore;
}
}
|
運行結果以下:
實驗2 測試程序2(5分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
/**
* This program demonstrates static methods.
* @version 1.02 2008-04-10
* @author Cay Horstmann
*/
public
class
StaticTest
{
public
static
void
main(String[] args)
{
// fill the staff array with three Employee objects
Employee[] staff =
new
Employee[
3
];
//構造了一個Employee數組,並填入了三個僱員對象
staff[
0
] =
new
Employee(
"Tom"
,
40000
);
staff[
1
] =
new
Employee(
"Dick"
,
60000
);
staff[
2
] =
new
Employee(
"Harry"
,
65000
);
// print out information about all Employee objects
for
(Employee e : staff)
{
e.setId();
System.out.println(
"name="
+ e.getName() +
",id="
+ e.getId() +
",salary="
+ e.getSalary());
////調用getName方法、getId方法以及getSalary方法將每一個僱員的信息打印出來
}
int
n = Employee.getNextId();
// calls static method 經過類名調用這個方法,只須要訪問類的靜態域
System.out.println(
"Next available id="
+ n);
//將其輸出在控制檯上
}
}
class
Employee
//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;
// set id to next available id
nextId++;
}
public
static
int
getNextId()
{
return
nextId;
// returns static field
}
public
static
void
main(String[] args)
// unit test
{
Employee e =
new
Employee(
"Harry"
,
50000
);
System.out.println(e.getName() +
" "
+ e.getSalary());
//輸出在控制檯上
}
}
|
運行結果以下:
實驗2 測試程序3(5分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|