课前问题列表
一、方法相关问题
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)changeStr()的功能:
初始化一个字符串变量x,修改传入变量x的值。
2)changeArr()的功能:
初始化一个字符串数组strs[ ],修改传入数组strs[]中元素的值。
1.2 main方法的x有没有被改变?为什么?
1)main方法中的x没有被改变。
2) 由于Java中的字符串有不可变性以及方法参数的值传递模式,所以字符串内部的修改不会影响到外部变量的值。
1.3 main方法的args数组的内容有没有被改变?为什么?
1)main方法中的args数组的内容会改变。
2)由于数组是引用类型,所以方法内部的修改会影响到外部数组的数值。
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。
1)args数组中的值可以通过命令行传递参数进来的数值。
2)或者可以在程序内部创建一个新的字符串数组,然后将新的字符串数组命名给args数组。
二、数组相关问题
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 这段程序输出结果是什么?为什么?
1)[2,1,0] [2,1,0]
2)首先创建了一个长度为3的整型数组,arr[0]=1初始化数组中的第
一个值为1,arr[1]=1初始化数组中第二个数值为1,创建数组arrX
使其和arr指向同一个数组,再改变数组中的第一个值为2,所以
输出[2,1,0]。
String[] strArr = {"aa","bb","cc"};
strArr[1] = "xx";
System.out.println(Arrays.toString(strArr));
2.2 字符串是不可变类,为什么可以对strArr[1]赋值"xx"?
字符串是不可变的,但是strArr[ ]是定义的引用类型数组,数组中的每个元素是可以转变string对象的引用。
三、使用int[5][]定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?
由于第二维数组并没有被定义,所以就可以自行定义为不同长度的int数组,如下是相关代码的实现。
public class Main{
public static void main(String[] args){
int[5][] array = new int[5][];
array[0] = new int[]{1,2,3,4,5};
array[1] = new int[]{1,2,5};
array[2] = new int[]{1,4,5};
array[3] = new int[]{1,2,3,4,5};
array[4] = new int[]{1,5};
for(int i = 0;i <array.length;i++)
{
for(int j = 0;j<array[i].length;j++)
{
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
}
四、类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?
1)类是一种抽象数据类型,用于描述一类对象的特征和行为,为了某种特定的对象而创建。
2)对象是类的一个实例,对象可以分配内存空间,可以通过调用类定义来进行某些操作。
3)Math没有对象,其主要用来提供数学运算的静态方法,可以通过不用创建类的实例来直接调用。
4)private: hashCode()、compareChars(char[] x, int xIndex, char[] y, int yIndex)等。
这样设计可以保护类的内部状态,优化一些程序提高性能,保证实现的正确性,维持不可变性。
5)public: length()、equals(Object anObject)等。
五、将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?
1)普遍使用这些模式因为其优点,可以控制对属性的访问、可以提高安全性,防止外部对代码的修改、可以提高灵活性。
2)setter/getter模式是实现封装的一种方式,可以更好地实现封装性原则。
六、对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?
1)对象的属性可以在声明时就直接初始化,也可以在初始化块中进行初始化,也可以在要使用前就进行初始化等,对象的属性可以在很多时机上进行初始化。
2)方法相对应时机,直接赋值、构造方法的参数、使用前进行初始化赋值。