第二周-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.进阶(可选):尝试使用作用域来说明封装性