JMU 第02周 预习作业

一、方法相关问题

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.1 changeStr与changeArr的功能各是什么?
1.2 main方法的x有没有被改变?为什么?
1.3 main方法的args数组的内容有没有被改变?为什么?
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。

1.1 changeStr与changeArr的功能各是什么?

答:changeStr接收一个字符串参数x,然后试图在方法体内将其值更改为"xyz",但是x的外部原有值不会因此改变。changeArr接收一个字符串数组strs作为参数,并通过循环遍历数组中的每一个元素,将其值修改为原值加上该元素的索引号,所做修改会保存下来。

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

没有,这是因为Java中字符串是不可变对象,当你对一个字符串变量进行赋值时,实际上是创建了一个新的字符串对象,并让变量指向这个新对象。原来的字符串对象(在这里是"abc")保持不变,并且main方法中的x仍然指向原来的字符串对象。

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

改变了,这个方法通过循环遍历数组strs的每个元素,并将其值修改为原值加上索引号。由于strs实际上是args的一个引用拷贝,因此在changeArr方法内部对strs所做的任何修改都会影响到main方法中的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 这段程序输出结果是什么?为什么?

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

2.1.这段程序输出结果是:

arr[]->[2 1 0]   arrrX[]->[2 1 0]
因为arrX指向的对象是arr,所以当arr指向改变时,arrX的指向也会改变。

2.2 字符串是不可变类,为什么可以对strArr[1]赋值"xx"。
3.使用int[5][]定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?
4.类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?
5.将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?
6.对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?

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

对其赋值改变的不是strArr中的值而是其引用,字符串是不可变类,意味着不能够改变它的值,但是可以改变它的引用;

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

无法确定;

 import java.util.Scanner;  
    public class Main {  
    public static void main(String[] args) {  
    Scanner sc = new Scanner(System.in);  
    int a[][] = new int[5][];
    for (int i = 0; i < a.length; i++) {  
            a[i] = new int[5]; 
            System.out.println("请输入第 " + (i + 1) + " 行的5个整数:");  
            for (int j = 0; j < a[i].length; j++) {  
                a[i][j] = sc.nextInt(); 
            }  
            System.out.println("第 " + (i + 1) + " 行的整数是:");  
            for (int j : a[i]) {  
                System.out.print(j + " ");  
            }  
            System.out.println();
        }  
            sc.close(); 
    }  
 }

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

类:类是一种抽象的数据类型,它定义了一组属性(也称为字段或成员变量)和方法(也称为成员函数),这些属性和方法描述了一类对象应该具备的行为和状态。类是对象的模板或蓝图,用来创建具体的对象实例。
对象:对象是类的一个实例。它是根据类定义的具体实体,具有类定义的属性和方法,并且每个对象都有自己的状态(即属性的值)。对象是实际存在于内存中的,可以通过它调用类定义的方法。

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

原因:尽管将类的属性设置为public可以方便其他类直接访问,但这种做法破坏了封装性,使得对象内部的数据变得不安全、易于被误修改,并且降低了代码的灵活性和可维护性。因此,在Java中普遍使用setter/getter模式来访问对象的属性;

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

1.声明时初始化: 当你声明一个类的属性时,可以直接为其分配一个初始值。这种方法适用于那些总是需要一个默认值的情况。
2.构造函数中初始化: 构造函数是在创建对象时调用的第一个方法。你可以在构造函数中为对象的属性分配值。这是最常用的初始化方式之一,特别是当对象需要一些特定的初始状态时。
3.初始化块(Instance Initialization Blocks): 初始化块是一段代码块,在对象创建时自动执行。初始化块可以在对象创建时为对象的属性分配值。初始化块特别适合于需要执行更多初始化工作的场景。
4.静态初始化块(Static Initialization Blocks): 静态初始化块类似于普通初始化块,但它只在类被加载时执行一次,而不是每次创建对象时执行。它通常用于初始化类级别的静态变量。
5.方法中初始化: 如果对象的某些属性需要在创建对象之后,基于某些条件或业务逻辑来确定初始值,可以在某个方法中进行初始化。
6.惰性初始化(Lazy Initialization): 惰性初始化是指直到真正需要使用某个属性时才对其进行初始化。这种方式可以节省资源,特别是在创建对象时并不需要立即使用所有属性的情况下。

  • 选择初始化方法的原则
    1.默认值:如果你希望一个属性在任何时候都应该有一个默认值,那么可以在声明时初始化。
    2.依赖于外部数据:如果属性的值依赖于外部数据或其他属性的值,那么可以在构造函数或方法中初始化。
    3.复杂初始化:如果属性的初始化过程较为复杂,可以考虑使用初始化块。
    4.静态属性:如果属性是静态的(即属于类而不是对象),那么可以使用静态初始化块。
    5.延迟加载:如果属性的初始化成本较高,而且不一定每次都使用到,那么可以采用惰性初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值