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有没有被改变?为什么?
答:没有被改变,main方法中的x是字符串 "abc" 的引用,在changeStr方法中修改的是副本,而原变量x的引用并未改变,仍然指向 "abc",因此输出结果仍是 "abc"。
1.3 main方法的args数组的内容有没有被改变?为什么?
答:被改变了,changeArr方法接收的是数组args的引用副本,但数组本身是引用类型,在方法中通过这个引用修改了数组元素的值,因此args数组的元素会改变。
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。
答:用户在启动 Java 程序时通过命令行输入。在类名后添加参数,参数之间用空格分隔。
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]。当执行 int[] arrX = arr; 时,arrX 和 arr 指向同一个数组对象。因此,当通过 arr[0] = 2 修改数组元素时,arr 和 arrX 指向的是同一个数组,所以两者的输出结果完全相同。初始数组未赋值的第三个元素默认为 0,因此最终输出为 [2, 1, 0]。
2.2 字符串是不可变类,为什么可以对strArr[1]赋值"xx"。
String[] strArr = {"aa","bb","cc"};
strArr[1] = "xx";
System.out.println(Arrays.toString(strArr));
答:strArr[1]赋值"xx",我们并不是在修改原字符串 "bb" 的内容,而是在改变数组索引 1 位置上存储的引用。赋值后,strArr[1] 改为指向新的字符串对象 "xx"。
3、使用int[5][]定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?
答:第二维的长度并未确定。
补全代码:import java.util.Arrays;
public class TwoDimensionalArray {
public static void main(String[] args) {
int[5][] int2DArray = new int[5][];int2DArray[0] = new int[2]; // 长度为2int2DArray[1] = new int[3]; // 长度为3int2DArray[2] = new int[1]; // 长度为1int2DArray[3] = new int[4]; // 长度为4int2DArray[4] = new int[5]; // 长度为5// 为数组元素赋值for (int i = 0; i < int2DArray.length; i++) {for (int j = 0; j < int2DArray[i].length; j++) {int2DArray[i][j] = i + j;}}System.out.println("foreach遍历结果:");for (int[] row : int2DArray) {for (int num : row) {System.out.print(num + " ");}System.out.println();}
4、类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?
答:类是抽象的模板,定义了对象的属性和行为,不占用内存空间,而对象是类的具体实例,占用内存空间。直接通过 Math.方法名() 调用,无需创建对象。
5、将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?
答:为了通过控制访问、校验数据等实现封装性,既保护属性不被随意修改,又提供安全灵活的访问方式。
6、对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?
答:对象的属性可在声明时、初始化块中、构造方法中、创建对象后进行初始化。如:声明属性时直接赋值;构造方法中赋值;