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的功能是改变字符串x的值,将其值变为"xyz"
changeArr的功能是改变字符串中每个字符的值,在原值基础上加上空和i
1.2 main方法的x有没有被改变?为什么?
没有,方法中只是创建了原有变对象的复制模板,因此在方法中只是改变了复制模板的值,原对象的值并未改变
1.3 main方法的args数组的内容有没有被改变?为什么?
被改变了。因为虽然在Java中字符串不变,但字符串引用可变,在args字符串数组中,调用changeArr方法本质上是更改了args数组中字符串引用的值,将引用更改到了新创建的值上
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。
由控制台输入(或者命令行);通过流输入或者其他相关方法
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"。
因为虽然在Java中字符串不变,但字符串引用可变,在strArr字符串数组中,调用changeArr方法本质上是更改了strArr数组中字符串引用的值,将引用更改到了新创建的值上
3.使用int[5][] 定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach或其他循环方法遍历这个二维数组?
第二维长度不确定,其长度具体取决于程序启动时的状态;
补全代码如下
int [][] arr=new int [5][];
for (int[] row : array){
for (int num : row) {
System.out.print(num + " ");
}
System.out.println();
}
4.类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?
类相当于一个未填充数据的模板,而对象则是已经填好数据的一个具体模板。math类是有对象的,但是math是一个静态类,因此对math类创建对象是不必要的。String存储字符的变量是私有的,为的是确保String存储的对象数据的可靠性,而lenth()方法则是公共的,因为要方便程序员获取字符串的长度。
5.将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?
为的是实现封装,这样方法或方法内变量的安全性就可以得到保障,外界调用方法或变量只需要会使用,而不用考虑内部的具体实现。
6.对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?
在初始化块中进行初始化,在声明时初始化或者在方法中初始化
7.进阶(可选):尝试使用作用域来说明封装性。
private使得方法或变量只能由内部访问,确保了其对外界的透明性(作用域在本类内)
public则可以让方法或变量被外界访问并修改,从而可以用来修饰getset方法来获取已封装的方法(作用域可以到达外部成员)