目录
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的功能各是什么?
(1)changeStr接受参数x,在方法内部创建一个新的字符串,将x赋值为“xyz”。
(2)changeArr用于遍历数组的每个元素将它与索引拼接。
1.2 main方法的x有没有被改变?为什么?
(1)没有被改变,因为字符串具有不变性,changeStr在内部创建了一个新的字符串,没有改变外部的x
1.3 main方法的args数组的内容有没有被改变?为什么?(1)有,因为数组是可变的。当
changeArr
方法遍历数组并修改每个元素时,它实际上是在修改数组对象本身的内容。
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。
在运行配置中对数组的内容进行赋值。
2.关于字符串
2.1数组
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));
这段程序输出结果是什么?为什么?
(1)
(2)先对arr数组进行赋值,再将arr数组的内容赋给arrX,说明arr与arrX指向同一对象。
2.2字符串的不变性
String[] strArr = {"aa","bb","cc"};
strArr[1] = "xx";
System.out.println(Arrays.toString(strArr));
运行结果:
字符串是不可变类,为什么可以对strArr[1]赋值"xx"?
(1)字符串是不可变类,不能修改字符串本身但是可以更改引用的位置。
(2)"bb"的没有被改变,仍存储在计算机中,只是strArr[1]引用的位置改为"xx"。
3.二维数组
使用
int[5][]
定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?(1)一维大小是固定的为5,二维大小是可变的。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] array = new int[5][];
array[0] = new int[] {1, 2,};
array[1] = new int[] {3,4,5};
array[2] = new int[] {6,7,8};
array[3] = new int[] {9,10};
array[4] = new int[] {11};
for(int[] row:array){
for(int value: row){
System.out.print(value+" ");
}
System.out.println();
}
}
}
(2)运行结果:
4.类与对象
类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?
(1)类是对象的抽象化,对象是类的实例化
(2)Math类没有对象。
Math
类中的所有方法都是静态的,直接调用这些方法不需要实例化对象。(3)private:offset 和 count这两个属性与 String 对象的内部表示有关,它们用于优化字符串的存储。这些属性也是私有的,以防止外部代码直接访问和修改它们。
public:length(计算长度)和substring(截取字串)
(4)1.通过使字符串不可变,Java确保了字符串内容的安全性。这意味着一旦一个字符串被创建,它就不会被意外地修改,可以用来保护数据。
2.由于字符串是不可变的,它们可以被缓存。例如,字符串字面量和一些常用的字符串操作结果可以被存储在字符串池(String Pool)中,这样可以减少内存使用并提高性能。
5.封装与访问
将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?
(1)封装是面向对象编程的核心概念之一,它强调将数据(属性)和操作这些数据的方法(行为)捆绑在一起,并隐藏内部实现细节。
(2)通过使用setter和getter方法,类可以控制外部对属性的访问。例如,getter方法可以返回属性的一个副本而不是直接返回属性本身,从而防止外部代码修改属性。同样,setter方法可以在设置属性值之前进行验证,确保只接受有效的值。
6.初始化
对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?
(1)在声明时初始化
public class Person { private int age = 10; // 声明时初始化 }
(2)通过方法进行初始化
public class Person { private int age; public void initValue() { this.age = 10; // 方法中初始化 } }