Java 复习笔记(二) - 转自 廖雪峰的 Java 教程
字符和字符串
Java 的字符类型 char 是基本类型,字符串类型 String 是引用类型;
基本类型的变量是“持有”某个数值,引用类型的变量是“指向”某个对象;
引用类型的变量可以是空值 null;
要区分空值 null 和空字符串 "",空字符串是一个有效的字符串对象,它不等于null。
数组类型
数组是同一数据类型的集合,数组一旦创建后,大小就不可变;
可以通过索引访问数组元素,但索引超出范围将报错;
数组元素可以是值类型(如int)或引用类型(如String),但数组本身是引用类型;
面向对象 方法 参数绑定
基本类型参数的传递是值传递,是调用方值的复制。双方各自的后续修改,互不影响。
引用类型参数的传递是引用(地址)传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。
为什么同为引用类型的字符串和字符串数组作为参数传递到实例 setter 方法中,字符串变量的修改不会影响实例变量,而字符串数组会?
字符串数组作为传递参数
Person p = new Person();
String[] fullname = new String[] { "Homer", "Simpson" };
p.setName(fullname); // 传入 fullname 数组
System.out.println(p.getName()); // "Homer Simpson"
fullname[0] = "Bart"; // fullname 数组的第一个元素修改为"Bart"
System.out.println(p.getName()); // "Bart Simpson"
字符串作为参数
Person p = new Person();
String bob = "Bob";
p.setName(bob); // 传入 bob 变量
System.out.println(p.getName()); // "Bob"
bob = "Alice"; // bob 改名为 Alice
System.out.println(p.getName()); // "Bob"
首先,参数绑定的机制是没有问题的。这个问题本身是有问题的,问题的前半部分正确,字符串数组和字符串作为参数确实都属于引用类型。问题出在对于指向对象的改变上,字符串类型对象在建立之后是不可变的,包含在这个对象中的字符序列是不可改变的。字符串类型对象重新赋值等于重新创建一个新的实例对象,而原来的实例对象并没有改变。要想真正改变字符串对象,应该用 StringBuilder 创建对象,然后调用对象方法修改字符序列。
构造方法
实例在创建时通过new操作符会调用其对应的构造方法,构造方法用于初始化实例;
没有定义构造方法时,编译器会自动创建一个默认的无参数构造方法;
可以定义多个构造方法,编译器根据参数自动判断;
可以在一个构造方法内部调用另一个构造方法,便于代码复用。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。