Java基础语法2、面向对象入门
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:
接收一个字符串数组参数 strs
遍历数组,将每个元素追加其索引值
会修改原数组内容,因为数组是引用类型
1.2 main方法的x有没有被改变?为什么?
没有改变。原因:
Java中方法参数传递是值传递
方法内的 x 只是局部变量,修改它不会影响外部变量
字符串是不可变类,即使修改也会创建新对象
1.3 main方法的args数组的内容有没有被改变?为什么?
会改变。原因:
数组是引用类型,方法接收的是引用的副本
虽然不能改变引用本身,但可以修改引用指向的数组内容
changeArr方法直接修改了数组元素
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。
来源:
从命令行启动程序时传递的参数
例如: java Main a b c 则 args = {"a","b","c"}
赋值方式:
命令行参数
在代码中直接修改元素: args[0] = "newValue"
重新分配数组: args = new String[]{"a","b"}
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 引用同一个数组对象
修改 arr[0] = 2 会影响所有指向该数组的引用
数组元素默认初始化为0,所以第三个元素是0
String[] strArr = {"aa","bb","cc"};
strArr[1] = "xx";
System.out.println(Arrays.toString(strArr));
2.2 字符串是不可变类,为什么可以对strArr[1]赋值"xx"。
字符串不可变指的是字符串对象本身不能被修改,但数组元素存储的是字符串引用。
3.使用int[5][]定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?
初始时第二维长度不确定,所有元素都是null
需要手动初始化每一行的长度
代码:
int[][] arr = new int[5][];
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
arr[3] = new int[4];
arr[4] = new int[5];
// foreach遍历
for (int[] row : arr) {
for (int num : row) {
System.out.print(num + " ");
}
System.out.println();
}
4.类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?
类:定义对象属性和行为的蓝图/模板
对象:类的实例,占用内存的具体实体
Math类:
没有公开的构造方法 所有方法都是static 不需要创建对象即可使用
String类:
private属性:
value[] :存储字符串的字符数组 hash :缓存的哈希码
public方法:
length() :返回字符串长度 substring() :截取子串 equals() :比较字符串内容
设计原因:
属性私有化:保证字符串不可变性
方法公有化:提供安全的操作接口
5.将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?
控制访问:可以在方法中添加验证逻辑
灵活性:未来可以修改内部实现而不影响外部接口
只读/只写控制:可以只提供getter或setter
支持监听机制:可以在值变化时触发事件
与封装性的关系:
封装性要求隐藏内部实现细节
Setter/getter提供了受控的访问方式
避免直接暴露内部状态,提高代码安全性和可维护性
6.对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?
初始化时机:
声明时直接初始化 构造方法中初始化 初始化块中初始化(静态和实例)
使用setter方法初始化 反射方式初始化
初始化方法:
显式赋值 默认值(数字0,布尔false,引用null)构造函数初始化 静态初始化块
实例初始化块 工厂方法创建并初始化 依赖注入框架初始化

浙公网安备 33010602011771号