字符和字符串

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操作符会调用其对应的构造方法,构造方法用于初始化实例;

没有定义构造方法时,编译器会自动创建一个默认的无参数构造方法;

可以定义多个构造方法,编译器根据参数自动判断;

可以在一个构造方法内部调用另一个构造方法,便于代码复用。

摘自:Java 教程 - 廖雪峰

文章目录