第02周 預(yù)習(xí)、實驗與作業(yè):Java基礎(chǔ)語法2、面向?qū)ο笕腴T
集美大學(xué)課程實驗報告-第02周 預(yù)習(xí)、實驗與作業(yè):Java基礎(chǔ)語法2、面向?qū)ο笕腴T
| 項目名稱 | 內(nèi)容 |
|---|---|
| 課程名稱 | Java |
| 班級 | 網(wǎng)安2413 |
| 指導(dǎo)教師 | 鄭如濱 |
| 學(xué)生姓名 | 林沁茹 |
| 學(xué)號 | 202421336067 |
| 實驗項目名稱 | 第02周 預(yù)習(xí)、實驗與作業(yè):Java基礎(chǔ)語法2、面向?qū)ο笕腴T |
| 上機實踐日期 | |
| 上機實踐時間 | 2學(xué)時 |
一、目的(本次實驗所涉及并要求掌握的知識點)
以下內(nèi)容請根據(jù)實際情況編寫
- 了解java中方法、數(shù)組、引用數(shù)據(jù)類型
- 掌握面向?qū)ο蠡A(chǔ) ”基本概念、封裝與模塊化、對象的初始化
二、課前問題解答
題目1—方法相關(guān)問題
public class Main {
static void changeStr(String x) {
x = "xyz";
}
static void changeArr(String[] strs) {
for (int i = 0; i < strs.length; i++) {
strs[i] = strs[i]+""+i;
}
}
public static void main(String[] args) {
String x = "abc";
changeStr(x);
System.out.println(x);
changeArr(args);
System.out.println(Arrays.toString(args));
}
}
對于如上代碼:
1.1 changeStr與changeArr的功能各是什么?
1.2 main方法的x有沒有被改變?為什么?
1.3 main方法的args數(shù)組的內(nèi)容有沒有被改變?為什么?
1.4 args數(shù)組中的值是從哪里來的?要怎么才能給他賦值。
1.1
changeStr:該方法接收一個String類型的參數(shù)x,并在方法內(nèi)部將x的值修改為"xyz"。(由于String在Java中是不可變的,且Java是按值傳遞的,因此該方法實際上不會修改調(diào)用者傳入的原始String對象的值,實際上是新建一個對象來存儲,且使x指向該地址)
changeArr:該方法接收一個String數(shù)組strs,然后遍歷數(shù)組中的每一個元素,并在每個元素后面拼接上當前元素的索引i。(由于數(shù)組是引用類型,方法內(nèi)部操作的是原始數(shù)組對象的引用副本,因此對數(shù)組元素的修改會直接影響調(diào)用者傳入的原始數(shù)組)
1.2
main方法的x沒有被改變,因為Java 是按值傳遞,changeStr(x) 傳遞的是x的引用地址(即x指向的字符串 "abc" 的地址)在changeStr 方法內(nèi)部,x="xyz"; 只是讓局部變量 x 指向了一個新的字符串對象 "xyz"的地址,而不會影響 main方法中的原始變量x。因此,main 方法中的 x 仍然指向原來的字符串 "abc",輸出結(jié)果為 abc。
1.3
main方法的args數(shù)組的內(nèi)容有被改變,因為args是一個String數(shù)組,屬于引用類型。changeArr(args)傳遞的是 args 數(shù)組的引用地址,這個地址指向的仍然是原始數(shù)組對象。在changeArr方法內(nèi)部,通過strs[i]=strs[i]+""+i; 修改了數(shù)組元素的值,由于strs和args實際指向的是同一個數(shù)組對象地址,因此修改會直接反映到main方法的args數(shù)組上。
1.4
來源:args是main方法的參數(shù),表示命令行參數(shù)。
賦值:當我們在命令行(或終端)中運行程序時,可以在類名后面?zhèn)魅雲(yún)?shù),這些參數(shù)會被自動解析為String數(shù)組并傳遞給main方法的args。
題目2—題目數(shù)組相關(guān)問題
對于如下程序
int[] arr = new int[3];
arr[0] = 1; arr[1] = 1;
int[] arrX = arr;
arr[0] = 2;
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arrX));
2.1 這段程序輸出結(jié)果是什么?為什么?
String[] strArr = {"aa","bb","cc"};
strArr[1] = "xx";
System.out.println(Arrays.toString(strArr));
2.2 字符串是不可變類,為什么可以對strArr[1]賦值"xx"。
2.1
[2,1,0]
[2,1,0]
數(shù)組arr和arrX存儲的是數(shù)組對象的引用(地址),而不是數(shù)組本身,int[] arrX = arr這行代碼并沒有創(chuàng)建新的數(shù)組,而是讓arrX指向arr所引用的同一個數(shù)組對象,修改arr的同時也是在修改arrX。
2.2
String的不可變性,指的是String對象本身的內(nèi)容不能被修改。數(shù)組本身是可變的,我們可以修改數(shù)組中元素的引用。strArr[1] = "xx"; 并不是修改原字符串"bb",而是讓數(shù)組的第二個元素指向一個新的字符串對象 "xx"的地址。
題目3—使用int[5][]定義一個二維數(shù)組,其第二維到底有多長?嘗試補全代碼,然后使用foreach獲其他循環(huán)方法遍歷這個二維數(shù)組?
第二維(列)的長度沒有定義,即每一行的列數(shù)可以不同,是可變的(也叫“鋸齒數(shù)組”).
public class Main {
public static void main(String[] args) {
int[][] arr = new int[5][5];
for (int i = 0;i<arr.length;i++) {
for (int j= 0;j<arr[i].length;j++) {
arr[i][j]=i * 10+j;
}
}
foreach(arr);
}
public static void foreach(int[][] arr) {
for (int[] row : arr) {
for (int i: row) {
System.out.print(i+" ");
}
System.out.println();
}
}
}
題目4—類與對象的區(qū)別是什么? Math類有對象嗎?String類有什么屬性是private的,有什么方法是public的,為什么這樣設(shè)計(嘗試舉兩例說明)?
1.類是對象的模板或藍圖,定義了對象的屬性(字段)和行為(方法);對象是類的實例,是具體的實體
2.Math類沒有對象
3.
(1)
1.private final char value[],防止外部直接修改字符數(shù)組,保證String的不可變性
2.private int hash,哈希碼是內(nèi)部優(yōu)化細節(jié),外部無需訪問,這樣可以防止外部篡改哈希碼
(2)
1.public charAt(int index),提供安全訪問字符的方式,而不暴露內(nèi)部 value 數(shù)組,還可以保證不可變性(返回的是 char,不是引用)
2.public String substring(int beginIndex),提供字符串截取功能,而不暴露內(nèi)部實現(xiàn),還可以返回新 String 對象,不修改原字符串(符合不可變性)
題目5—將類的屬性設(shè)置為public可以方便其他類訪問,但為什么Java中普遍使用setter/getter模式對對象的屬性進行訪問呢?這與封裝性又有什么關(guān)系?
如果將類的屬性直接設(shè)為public,外部類可以直接訪問和修改,會無法添加額外邏輯,還會無法控制賦值,破壞封裝性;
使用setter/getter模式,可以在 setter 中添加驗證邏輯,還可以getter中返回副本或計算值(如返回格式化的字符串),封裝的核心思想是隱藏內(nèi)部實現(xiàn),只暴露必要的接口,而setter/getter 是對屬性的受控訪問,而不是直接暴露,符合封裝性。
題目6—對象的屬性可在什么時候進行初始化?都有哪些進行初始化的辦法?
對象的屬性可以在聲明時、構(gòu)造方法中、初始化塊中、靜態(tài)初始化塊中、setter 方法中或通過反射進行初始化。
方法:1.在定義成員變量時直接賦值;2.在構(gòu)造方法中對屬性賦值;3.使用 {} 初始化塊;4.使用 static {} 初始化靜態(tài)屬性,類加載時執(zhí)行一次;5.對象創(chuàng)建后,通過 setter 方法賦值;6.使用反射機制動態(tài)設(shè)置屬性值
題目7—進階(可選):嘗試使用作用域來說明封裝性。
封裝性通過作用域(訪問修飾符)實現(xiàn),控制類成員的可見性。
1.使用 private 限制直接訪問
2.使用 default 實現(xiàn)包級私有(同一個包內(nèi)的類可以訪問,但對外部包隱藏)
3.使用 protected 允許子類訪問
4.使用 public 提供公共接口
三、實驗使用環(huán)境(本次實驗所使用的平臺和相關(guān)軟件)
以下請根據(jù)實際情況編寫
- 操作系統(tǒng):Windows 11專業(yè)版
- 編程語言:Java
- 開發(fā)工具:[eclipse)

浙公網(wǎng)安備 33010602011771號