第03周 預習、實驗與作業:面向對象入門2與類的識別
集美大學課程實驗報告-第03周 預習、實驗與作業:面向對象入門2與類的識別
| 項目名稱 | 內容 |
|---|---|
| 課程名稱 | Java |
| 班級 | 網安2413 |
| 指導教師 | 鄭如濱 |
| 學生姓名 | 林沁茹 |
| 學號 | 202421336067 |
| 實驗項目名稱 | 第03周 預習、實驗與作業:面向對象入門2與類的識別 |
| 上機實踐日期 | |
| 上機實踐時間 | 2學時 |
一、目的(本次實驗所涉及并要求掌握的知識點)
- 重點:掌握pivate、public關鍵字的用途及其與setter/getter模式和封裝性之間的關系。
- 理解static屬性與static方法的用途。
- 掌握使用初始化塊初始類的方法。掌握初始化塊與靜態初始化塊的區別。
- 掌握使用package管理類。
- 重點:學會識別問題中的類并定義解決問題所需要的類。
- 初步了解Java編程規范。
二、課前問題解答
題目1—什么樣的方法應該用static修飾?不用static修飾的方法往往具有什么特性?Student的getName應該用static修飾嗎?
1. static意味著“靜態的”或“屬于類的”。當一個方法被static修飾后,它就不再屬于任何一個具體的對象實例,而是直接屬于類本身。
2. 當一個方法沒有static修飾時,它被稱為實例方法。它代表了對象的行為,并且與對象的狀態緊密相關。
3. 不能,getName是為了獲得特定的學生的名字,而不是整個類共有的相同名字。
題目2—購物車案例中,使用了什么方法將問題描述中的類、方法、屬性找出來?方法與屬性到底屬于哪個類,要怎么判定呢?
1.名詞-動詞分析法,根據需求寫出代碼
2.同一類的方法和屬性封裝在一起
題目3—一個項目中有很多類。怎樣才能避免你項目中的類與別人編寫的類同名呢?項目中類各種各樣要怎么管理這些代碼呢?舉例說明。
1.使用包來區分分類
2.
(1)按功能分包,例如:Controller包,Service包等
(2)按層分包(分層架構),例如:四層結構(表示層、應用程序層、領域層、基礎設施層),三層結構(顯示層(UI層)、業務邏輯層(BLL)、數據訪問層(DAL)),SSH框架(域模塊層、數據持久化層、業務邏輯層、頁面表示層)
(3)使用 Maven/Gradle 管理依賴
例如:Maven 項目結構示例
my-project/
├── pom.xml // 項目配置文件
├── src/
│ ├── main/
│ │ ├── java/ // Java 源代碼
│ │ └── resources/ // 配置文件
│ └── test/
│ ├── java/ // 測試代碼
│ └── resources/ // 測試資源
(4)使用模塊化
例如:模塊化項目結構
my-project/
├── cart-module/
│ ├── src/
│ │ └── module-info.java
│ └── com/example/cart/
├── payment-module/
│ ├── src/
│ │ └── module-info.java
│ └── com/example/payment/
題目4—閱讀《阿里巴巴Java開發手冊 終極版(1.3.0)》,寫出至少7條Java編程規范。應包含如下幾個方面:
變量命名、類命名、方法命名、常量命名、包命名、代碼格式、OOP規約。
1.代碼格式
- 杜絕完全不規范的縮寫,避免望文不知義。
- 為了達到代碼自解釋的目標,任何自定義編程元素在命名時,使用盡量完整的單詞組合來表達其意
- 如果模塊、接口、類、方法使用了設計模式,在命名時體現出具體模式
- 大括號的使用約定。如果是大括號內為空,則簡潔地寫成{}即可,不需要換行;如果是非空代碼塊則
- 左小括號和字符之間不出現空格;同樣,右小括號和字符之間也不出現空格
- if/for/while/switch/do 等保留字與括號之間都必須加空格
- 任何二目、三目運算符的左右兩邊都需要加一個空格
- 采用 4 個空格縮進,禁止使用 tab 字符
- 注釋的雙斜線與注釋內容之間有且僅有一個空格
- 單行字符數限制不超過 120 個,超出需要換行,換行時遵循如下原則:
1) 第二行相對第一行縮進 4 個空格,從第三行開始,不再繼續縮進
2) 運算符與下文一起換行。
3) 方法調用的點符號與下文一起換行。
4) 方法調用時,多個參數,需要換行時,在逗號后進行。
5) 在括號前不要換行 - 方法參數在定義和傳入時,多個參數逗號后邊必須加空格
- IDE 的 text file encoding 設置為 UTF-8; IDE 中文件的換行符使用 Unix 格式,不要使用 Windows 格式
2.變量命名
- 代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束
- 代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式(國際通用的名稱,可視同英文)
- 中括號是數組類型的一部分,數組定義如下:String[] args
- POJO 類中布爾類型的變量,都不要加 is,否則部分框架解析會引起序列化錯誤。反例:定義為基本數據類型 Boolean isDeleted;的屬性,它的方法也是 isDeleted(),RPC框架在反向解析的時候,“以為”對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異
3.類命名
- 類名使用 UpperCamelCase 風格,必須遵從駝峰形式(單詞連寫,不使用空格或下劃線,每個單詞的首字母大寫或小寫,以區分單詞邊界),但以下情形例外:DO / BO / DTO / VO / AO
- 抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結尾;測試類命名以它要測試的類的名稱開始,以 Test 結尾。
4.方法命名
- 方法名、參數名、成員變量、局部變量都統一使用 lowerCamelCase 風格,必須遵從駝峰形式
5.常量命名
- 常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長
6.常量命名
- 不允許任何魔法值(即未經定義的常量)直接出現在代碼中
- long 或者 Long 初始賦值時,使用大寫的 L,不能是小寫的 l,小寫容易跟數字 1 混
淆,造成誤解 - 不要使用一個常量類維護所有常量,按常量功能進行歸類,分開維護
- 如果變量值僅在一個范圍內變化,且帶有名稱之外的延伸屬性,定義為枚舉類。下面
正例中的數字就是延伸信息,表示星期幾
7.包命名
- 包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用單數形式,但是類名如果有復數含義,類名可以使用復數形式。
8.OOP規約
- 避免通過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增加編譯器解析成
本,直接用類名來訪問即可 - 所有的覆寫方法,必須加@Override 注解
- 相同參數類型,相同業務含義,才可以使用 Java 的可變參數,避免使用 Object(可變參數必須放置在參數列表的最后)
- 外部正在調用或者二方庫依賴的接口,不允許修改方法簽名,避免對接口調用方產生影響。接口過時必須加@Deprecated 注解,并清晰地說明采用的新接口或者新服務是什么
- 不能使用過時的類或方法*
- Object 的 equals 方法容易拋空指針異常,應使用常量或確定有值的對象來調用equals
- 所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較
- 關于基本數據類型與包裝數據類型的使用標準如下:
1) 【強制】所有的 POJO 類屬性必須使用包裝數據類型。
2) 【強制】RPC 方法的返回值和參數必須使用包裝數據類型。
3) 【推薦】所有的局部變量使用基本數據類型。 - 定義 DO/DTO/VO 等 POJO 類時,不要設定任何屬性默認值
- 序列化類新增屬性時,請不要修改 serialVersionUID 字段,避免反序列失敗;如果完全不兼容升級,避免反序列化混亂,那么請修改 serialVersionUID 值
- 構造方法里面禁止加入任何業務邏輯,如果有初始化邏輯,請放在 init 方法中
- POJO 類必須寫 toString 方法。使用 IDE 的中工具:source> generate toString時,如果繼承了另一個 POJO 類,注意在前面加一下 super.toString*
三、實驗使用環境(本次實驗所使用的平臺和相關軟件)
以下請根據實際情況編寫
- 操作系統:Windows 11專業版
- 編程語言:Java
- 開發工具:[eclipse)
四、附件-參考文件
購物車案例
Commodity.java
點擊查看代碼
package shopping;
/**
* 商品類:用來存放商品的信息(商品名稱name、商品價格price)。
* 該類有待完善。比如,未包含能唯一標識商品的商品編號屬性。
*/
public class Commodity {
private String name;
private double price;
public Commodity(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
ShoppingCart.java
點擊查看代碼
package shopping;
import java.util.ArrayList;
/**
* 購物車類:可以用來存放商品,且包含購物車常用的操作方法。
* 該類有待完善。未包含清空購物車、刪除某件商品、修改某件商品的數量等方法。
*/
public class ShoppingCart {
private ArrayList<Commodity> items = new ArrayList<>();//存放商品的容器
/**
* 往購物車里面存放商品。
* 該方法還不完善,未能將相同商品歸為一項。你能修改完善嗎?
* 怎么能獲得某件商品的數量?
* @param item
*/
public void add(Commodity item) {
items.add(item);
}
/**
* 獲得購物車內商品的數量
* @return 購物車內商品的數量
*/
public int getQty() {
return items.size();
}
/**
* 結算
* @return 返回購物車中所有商品的總價
*/
public double checkout() {
double x = 0;
for (Commodity commodity : items) {
x += commodity.getPrice();
}
return x;
}
/**
* 顯示購物車中的商品
*/
public void show() {
for (Commodity commodity : items) {
printCommodity(commodity);
System.out.println();
}
}
private void printCommodity(Commodity commodity) {
System.out.printf("name: %s, price: %f", commodity.getName(), commodity.getPrice());
}
}
Main.java
點擊查看代碼
package shopping;
public class Main {
public static void main(String[] args) {
Commodity c1 = new Commodity("蘋果", 10.5);
Commodity c2 = new Commodity("蘋果", 10.5);
Commodity c3 = new Commodity("手機", 25.99);
Commodity c4 = new Commodity("Java教程", 8.88);
ShoppingCart cart = new ShoppingCart();
cart.add(c1);cart.add(c2);cart.add(c3);cart.add(c4);
double x = cart.checkout();
cart.show();
System.out.println("數量"+cart.getQty());
System.out.println("總價:"+x);
}
}

浙公網安備 33010602011771號