java相關問題解答
java相關問題解答
1.方法相關問題
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的功能各是什么?
*changeStr: 嘗試將傳入的字符串引用指向新字符串"xyz"
*changeArr: 遍歷數組并將每個元素修改為原值加上索引號(如"aa"變為"aa0")
1.2 main方法的x有沒有被改變?為什么?
答:沒有改變。因為:
*Java采用值傳遞(pass-by-value)
*字符串是不可變對象
*changeStr方法中的x只是原始x的一個副本引用
*修改副本引用不會影響原始引用
1.3 main方法的args數組的內容有沒有被改變?為什么?
答:有改變。因為:
*數組引用傳遞的是數組對象的引用副本
*副本引用和原始引用都指向同一個數組對象
*通過副本引用修改數組元素會影響原始數組
1.4 args數組中的值是從哪里來的?要怎么才能給他賦值。
答:args數組的值來自命令行參數。
賦值:
*命令行:java Main arg1 arg2 arg3
*在IDE中:在運行配置中設置程序參數
*通過其他數組賦值:args = new String[]{"a", "b", "c"}
2.數組相關問題
2.1 這段程序輸出結果是什么?為什么?
int[] arr = new int[3];
arr[0] = 1; arr[1] = 1;
int[] arrX = arr; // arrX和arr指向同一個數組對象
arr[0] = 2; // 修改的是同一個數組
System.out.println(Arrays.toString(arr)); // [2, 1, 0]
System.out.println(Arrays.toString(arrX)); // [2, 1, 0]
答:輸出結果都為[2,1,0],因為arrX = arr使得兩個引用指向同一個數組對象。
2.2 字符串是不可變類,為什么可以對strArr[1]賦值"xx"。
答:字符串不可變指的是String對象本身內容不可變,strArr[1] = "xx"是修改數組引用,讓數組的第二個元素指向新的String對象,原來的"bb"字符串對象沒有被修改,仍然存在
3.二維數組問題
int[5][] arr = new int[5][]; // 第二維長度不確定,需要單獨初始化
// 初始化第二維
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[1];
arr[3] = new int[4];
arr[4] = new int[2];
// 使用foreach遍歷
for (int[] innerArr : arr) {
for (int num : innerArr) {
System.out.print(num + " ");
}
System.out.println();
}
// 使用for循環
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
4.類與對象問題
類與對象的區別是什么?
答:類:定義對象的屬性和方法。對象:類的實例,具體的實體。
Math類有對象嗎?
答:沒有,Math類是final類,無法實例化對象。
String類的private屬性和public方法
*private屬性:private final char value[](存儲字符數據)
*public方法:length(), charAt(), substring(), equals()等
設計原因:
比較安全,防止外部直接修改字符串內容,保證不可變性。
5.訪問方法與封裝性問題
setter/getter模式與封裝性
為什么使用setter/getter而不是public屬性:
控制訪問:可以添加驗證邏輯(如年齡不能為負數)
保持兼容性:可以在不改變接口的情況下修改內部實現
延遲初始化:可以在getter中實現懶加載
只讀/只寫控制:可以只提供getter或setter
與封裝性的關系:setter/getter是封裝性的具體體現,將數據隱藏,通過方法提供受控的訪問。
6.初始化問題
初始化時機:
*聲明時直接初始化
*構造方法中初始化
*初始化塊中初始化
*懶加載(第一次使用時初始化)
初始化方法:
public class Example {
//聲明時初始化
private String name = "default";
//初始化塊
{
age = 18;
}
//靜態初始化塊
static {
count = 0;
}
//構造方法中初始化
public Example(String name) {
this.name = name;
}
//懶加載
private List<String> data;
public List<String> getData() {
if (data == null) {
data = new ArrayList<>();
}
return data;
}
}

浙公網安備 33010602011771號