第02周 预习:Java基础语法2、面向对象入门
-
方法相关问题
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的功能是为原字符串添加序号
1.2 main方法的x有没有被改变?为什么?
没有。String虽然是引用数据类型传参也是传引用值,但它是不可变类(final)。当执行x="xyz"时,又新创建了一个内存空间存放"xyz"并将新的引用值赋值给x。
以下为该程序运行的可视化过程
1.3 main方法的args数组的内容有没有被改变?为什么?
没有。因为args数组没有初始化,即args数组没有如何元素(意味着strs.length=0)。
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。
args数组中的值通常是由调用Java程序时传递给main方法的命令行参数来填充的。
①使用命令行传参
②在eclipse中击鼠标选择Run AS,然后选择Run Configurations,弹出的窗口 右侧选 Arguments,在program arguments栏输入参数
-
数组相关问题
对于如下程序
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]
arrX与arr的引用值相同都指向同一个数组,arr[0]=2,修改了原来arr[0]的值。此时输出结果为[2, 1, 0]。
String[] strArr = {"aa","bb","cc"}; strArr[1] = "xx"; System.out.println(Arrays.toString(strArr));
2.2字符串是不可变类,为什么可以对strArr[1]赋值"xx"。
字符串是不可变类指的是原字面值不会改变,但是会重新申请一个新的内存空间存放字符串"xx",并且将新的引用值赋值给strArr[1]。
-
使用int [5][] 定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?
长度不确定,由自己定义。
for(int i=0;i<5;i++){ for(int temp : a[i]){ System.out.println(temp); } }
-
类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?
一、类与对象的区别:
- 定义和实例化:
- 类是对一类具有相同属性和行为的对象进行描述的模板或蓝图。它定义了对象的属性(成员变量)和行为(方法),但本身并不占用内存空间。
- 对象是类的一个实例。当我们使用类创建对象时,才会在内存中分配空间以存储对象的具体实例数据。
- 内存占用:
- 类本身只是一个模板,不占用实际的内存空间。它只有在实例化为对象时,才会分配内存空间来存储对象的数据。
- 每个对象在内存中都有自己的存储空间,包含了对象的属性和方法。
- 关系:
- 类与对象之间是一种抽象与实例化的关系。类是对象的抽象描述,而对象是类的具体实体。
- 一个类可以有多个对象的实例,它们共享同一个类的属性和方法,但各自的数据可能不同。
- 使用:
- 类是用来定义对象的结构和行为的,它提供了创建对象的模板。我们通过实例化类来创建对象,并调用对象的方法来完成具体的操作。
二、Math类没有对象
三、
-
私有属性(private fields):
private final char value[];
:String类内部使用字符数组来存储字符串的值。这个字符数组被声明为私有的(private),这意味着该属性只能在String类内部进行访问和修改,外部无法直接访问它。这种设计可以保证字符串内容的不可变性(Immutable),防止外部代码直接修改字符数组,从而确保字符串对象的安全性和不可变性。
-
公共方法(public methods):
-
public int length()
:返回字符串的长度。这个方法被声明为公共的(public),意味着它可以被任何其他类使用。通过公开length()方法,其他类可以方便地获取某个字符串的长度信息。 -
public String substring(int beginIndex, int endIndex)
:返回指定范围内的子字符串。这个方法也是公共的(public),允许其他类根据需求提取出字符串中的一个子串。公开substring()方法可以方便地支持字符串的截取操作。私有属性可以保护数据的安全性和完整性,防止外部直接访问和修改;而公共方法提供了对对象的操作接口,使其他类能够使用和调用类的功能
-
- 定义和实例化:
-
将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?
通过setter方法,类可以对传入的数据进行验证和处理,确保数据的有效性和一致性。例如,可以在setter方法中添加逻辑来检查输入的数据是否符合要求,防止错误或不合理的值被赋予属性。这增加了程序的健壮性和安全性。
将属性私有化而方法声明为公共的就体现了封装性。
-
对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?
创建对象时,调用setter方法时。
①默认初始化
②显示初始化
③使用初始化块或静态初始化块
④使用构造器
⑤使用setter方法
-
进阶(可选):尝试使用作用域来说明封装性。
java中属性与方法的作用域依赖权限修饰符如private、public、protected、缺省。被private修饰的属性或方法只能在本类中使用,而被public修饰的属性或方法可以在其它包非子类中使用,因此使用权限修饰符可以使某些属性或方法只能在本类中使用,这就体现了封装性。