第二周-Java基本语法与面向对象入门-预习任务

第二周-预习任务-Java基本语法与面向对象入门

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[i]中

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

没有改变,参数是基本类型,函数不能改变参数的值。

1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的

2、对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数

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

参数不指定,agrs接收的是null

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

  • 从命令提示符中传值
  • 直接在java代码中赋值

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指向同一个数组对象

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

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

[aa, xx, cc]

strArr中的bb更改为了xx,在声明strArr字符串的时候只是声明了一个地址,当改变它的值的时候,不是重新给他赋值,而是重新申请了一个地址。

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

foreach的语句格式: 
for(元素类型t 元素变量x : 遍历对象obj){ 
   引用了x的java语句;
} 
public class Main {

    public static void main(String[] args) {

        int [][]arr=new int[][]{
                {1,2,3},
                {4,5,6},
                {7,8,9}
        };
        for(int x[] :arr) {
for(int y:x){
                System.out.print(y+" ");
            }
            .out.println(" ");
        }
    }

}

输出
1 2 3  
4 5 6  
7 8 9  

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

  • 类是面向对象程序设计实现信息封装的基础,是一种用户定义的引用数据类型。是表示现实世界中某个具体的事物

  • 对象是一个存储器地址,对象是某一个类的实例。是对对象的抽象描述

  • 没有,math类有了构造方法,构造函数被设置为私有的,math类中的方法是静态公开的。

  • String类的private属性:value public方法:

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

  • setter/getter 统一了这个类的变量修改\获取值的口子,更加方便你对这个类的控制
  • 比如这个类的某个变量我不想让你去修改它,那我就把set方法删了就行,比如我想要限制set方法设置的值的范围,get方法获取值的时候,返回一个比较特殊的值,这些需求可以很方便的通过setter/getter去设置,减小对源代码的修改,而且扩展性更好。
  • 封装之后会更安全,有类型检查

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

  • 使用new关键字创建类的实例对象时、读取一个类的静态属性、设置一个类的静态属性、调用类的静态方法时;

  • 使用java.lang.reflect包中的方法对类进行发射操作的时候,如果类没有被初始化,则进行初始化;

  • 初始化一个类的时候,其父类没有被初始化,先初始化其父类;

  • 当应用启动的时候,如果指定了引导类,引导类没有初始化,先初始化这个引导类;

  • 在JDK7中,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有被初始化,先触发其初始化操作。

1.指定初始化,即直接赋值

2.构造器初始化,在调用一个类之前,都需要调用initialize()方法。通过调用initialize()方法,我们可以搭建一个构造器,保证所有的对象都会得到初始化。

3.静态数据的初始化

轻轻松松了解Java的初始化方法(含对象数组的小问题) - jirath - 博客园 (cnblogs.com)

7.进阶(可选):尝试使用作用域来说明封装性

posted @ 2021-09-12 15:25  GGGa-Yi  阅读(54)  评论(0编辑  收藏  举报