第02周 预习、实验与作业:Java基础语法2、面向对象入门——1.3 课前问题列表

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",但是由于Java中字符串是不可变的,所以这个修改只会在方法内部生效,而不会影响到main方法中的x变量。

changeArr方法的功能是将传入的字符串数组参数strs中每个元素都加上它自己的下标i,并且返回修改后的新数组。


1.2 main方法的x有没有被改变?为什么?

没有改变。Java中的参数传递是值传递,而不是将变量本身传递给方法。在changeStr中,对参数x进行了重新赋值操作,但并不影响main方法中的x变量。在changeArr中,虽然修改了strs数组中的元素值,但不影响main方法中args数组中的元素值,因为它们指向不同的内存地址。


1.3 main方法的args数组的内容有没有被改变?为什么?

有。在changeArr方法中修改args数组元素的值会影响到main方法中原来args数组所的字符串对象。


1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。

从命令行参数中来。使用IDE的运行配置手动输入参数赋值或者cmd命令。

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]的值时,实际上也改变了arrX[0]的值。

String[] strArr = {"aa","bb","cc"};
strArr[1] = "xx";
System.out.println(Arrays.toString(strArr));

2.2 字符串是不可变类,为什么可以对strArr[1]赋值"xx"。

在Java中,字符串数组是可变的。这里修改的是数组中元素的引用,而不是字符串本身。

3.使用int[5][] 定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?

第二维的长度是不确定的,需要动态分配。

for (int[] row : arr) {
    for (int num : row) {
        System.out.print(num + " ");
    }
    System.out.println();
}

4.类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?

类是一种模板或蓝图,用于定义对象的属性和方法。而对象是类的一个实例,它具有该类定义的属性和方法。由于Math类中所有方法都是静态方法(已经自定义好的),因此不需要创建Math对象就可以直接使用其中的方法。String类中有许多私有属性,如value、coder等等。这些私有属性在外部无法直接访问和修改。同时,String类中也有许多公共方法,如charAt、indexOf、substring等等。这样设计的一个原因是为了保护数据的安全性和完整性;另一个原因则是为了提供更好的封装性和抽象性。

5.将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?

使用setter/getter模式可以在保证封装性的同时,提供更好的控制和安全性。

6.对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?

1.声明时初始化:直接赋值。

2.构造方法初始化:在对象被创建时用构造的方法赋值。

3.初始化块初始化:使用初始化块,在类或对象为其赋值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值