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:遍历传入的字符串数组,将数组中的每个元素修改为原元素值加上其索引。
1.2 main方法的x有没有被改变?为什么?
没有。方法参数传递是值传递,修改发生在方法内部,而原变量x的引用并未改变。
1.3 main方法的args数组的内容有没有被改变?为什么?
有。changeArr方法接收的是数组args与原args指向同一个数组对象。
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。
args数组存储的是程序运行时传入的命令行参数。在IDEA中修改运行配置,添加程序实参。
2. 数组相关问题
对于如下程序
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 这段程序输出结果是什么?为什么?
输出结果:
[2,1,0]
[2,1,0]
arr和arrx指向同一个数组对象,所以arrx的内容与arr一致。
String[] strArr = {"aa","bb","cc"};
strArr[1] = "xx";
System.out.println(Arrays.toString(strArr));
2.2 字符串是不可变类,为什么可以对strArr[1]赋值"xx"。
strArr[1] = "xx"的操作,并不是修改原 "bb" 字符串的内容,而是将数组第 1 个位置的引用从指向 "bb" 对象改为指向"xx" 对象。
3. 二维数组问题
使用int[5][]定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?
第二维的长度是不确定的。
import java.util.Arrays;
public class TwoDArrayWithoutSecondDimension {public static void main(String[] args) { int[][] twoDArray = new int[5][]; System.out.println("二维数组内容:");for (int i = 0; i < twoDArray.length; i++) {System.out.print("第" + i + "行:");if (twoDArray[i] == null) {System.out.println("null)");} else { for (int j = 0; j < twoDArray[i].length; j++) {System.out.print(twoDArray[i][j] + " ");}System.out.println();}}}
}
4. 类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?
类是抽象概念,对象是具体存在,对象由类实例化而来。
Math类没有对象。
Char[] value是private的,字符串的获取、比较等都是public的。
private属性隐藏了字符串的存储细节,防止外部直接修改,确保 String 的不可变性,public方法提供了安全的操作接口,既满足了外部对字符串的常用需求,又不会破坏内部的不可变性。
private 属性示例
private final char value[]:存储字符串的字符数组。
这是 String 类的核心属性,用于保存字符串的实际内容。
public 方法示例
public int length():返回字符串的长度。
外部需要知道字符串的长度,但无需直接访问value数组,通过方法封装实现安全访问。
5. 将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?
(1)实现封装性,隐藏内部细节
(2)控制属性的访问权限和合法性
(3)提供灵活性和可扩展性
6. 对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?
(1)声明时直接初始化
(2)构造方法时初始化
(3)通过setter方法初始化
(4)初始化块