Java中的构造器和this关键字

1. 类的成分:构造器


1.1 构造器的定义与作用

定义
构造器是类中用于初始化对象的特殊方法,在通过 new 关键字创建对象时自动调用。

核心作用

  • 为对象的成员变量赋初始值
  • 执行对象创建时必要的初始化逻辑(如资源加载)。

语法格式

public class 类名 {
    // 构造器定义
    public 类名(参数列表) {
        // 初始化代码
    }
}

示例

public class Student {
    String name;
    int age;

    // 无参构造器
    public Student() {
        System.out.println("无参构造器被调用");
    }

    // 有参构造器
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("有参构造器被调用");
    }
}

1.2 构造器的特点
  1. 自动调用

    • 使用 new 创建对象时,构造器会被自动执行。
    Student s = new Student(); // 调用无参构造器
    Student s2 = new Student("张三", 20); // 调用有参构造器
    
  2. 命名规则

    • 构造器名称必须与类名完全一致,且没有返回值类型(包括 void)。
  3. 支持重载

    • 一个类可以定义多个不同参数的构造器,实现多样化的初始化方式。
    public class Car {
        String brand;
        double price;
    
        public Car() {} // 无参构造器
        public Car(String brand) { 
            this.brand = brand; 
        }
        public Car(String brand, double price) {
            this.brand = brand;
            this.price = price;
        }
    }
    

1.3 构造器的应用场景
  • 直接初始化属性
    通过有参构造器,在创建对象时直接为属性赋值,减少后续的 setter 调用。

    Student s = new Student("李四", 22); // 一步完成属性初始化
    
  • 执行初始化逻辑
    例如加载配置文件、建立数据库连接等。

    public class Database {
        public Database() {
            loadConfig(); // 初始化时加载配置
            connect();    // 建立数据库连接
        }
    }
    

1.4 注意事项
  1. 默认无参构造器的失效

    • 若未定义任何构造器,Java 会默认提供一个无参构造器。
    • 若定义了有参构造器,默认无参构造器将失效,需手动添加。
    public class Student {
        public Student(String name) {} // 定义有参构造器后,默认无参构造器失效
        public Student() {} // 必须显式定义无参构造器
    }
    
  2. 构造器调用链

    • 使用 this() 调用同类中的其他构造器,减少代码冗余。
    public class Book {
        String title;
        String author;
    
        public Book() {
            this("未命名", "未知作者"); // 调用有参构造器
        }
    
        public Book(String title, String author) {
            this.title = title;
            this.author = author;
        }
    }
    
  3. 继承中的构造器

    • 子类构造器必须通过 super() 调用父类构造器(默认调用父类无参构造器)。
    • 若父类没有无参构造器,子类必须显式调用父类的有参构造器。
    public class Animal {
        public Animal(String type) {}
    }
    
    public class Dog extends Animal {
        public Dog() {
            super("犬科"); // 必须显式调用父类有参构造器
        }
    }
    

1.5 内存与执行流程

对象创建过程

  1. 在堆内存中分配对象空间。
  2. 根据构造器参数调用对应的构造器。
  3. 执行构造器内的代码(初始化属性或执行逻辑)。
  4. 返回对象引用给栈内存中的变量。

示例

Student s = new Student("王五", 25);  

内存分配示意图

| 内存区域 | 存储内容                          |
|----------|-----------------------------------|
| 堆内存   | Student对象:name="王五", age=25  |
| 栈内存   | 变量 s 存储堆内存地址(如0x4f3f5b24) |

1.6 总结
  • 核心功能:构造器确保对象被正确初始化,避免未赋值属性引发的逻辑错误。
  • 使用规范
    • 优先通过构造器完成对象属性的初始化。
    • 显式定义无参构造器,避免因有参构造器的定义导致默认构造器失效。
  • 进阶技巧
    • 利用 this()super() 优化构造器调用链。
    • 结合业务需求,在构造器中执行必要的初始化逻辑。

2. 类的成分:成员方法与 this 关键字


2.1 this 关键字的定义与作用

定义

  • this 是一个隐含的引用变量,表示当前对象。
  • 当对象调用方法时,this 指向该对象本身,可以通过 this 访问对象的成员变量和方法。
  • 哪个对象调用这个方法,this就拿到哪个对象!!!!

核心作用

  1. 区分成员变量与局部变量同名时的访问冲突。
  2. 在方法中调用当前对象的其他成员方法或构造器。

2.2 this 解决变量名冲突

场景
当成员变量与方法的局部变量同名时,默认访问的是局部变量。使用 this 可以显式访问成员变量。

示例

public class Student {
    String name; // 成员变量

    public void setName(String name) { // 局部变量 name
        this.name = name; // 使用 this 访问成员变量
    }
}

说明

  • this.name 表示当前对象的成员变量 name
  • 未使用 this 时,name 仅指向局部变量。

2.3 this 调用成员方法

场景
在类的成员方法中,可以通过 this 调用其他成员方法(通常可省略 this)。

示例

public class Calculator {
    public void add(int a, int b) {
        System.out.println("和:" + (a + b));
    }

    public void calculate() {
        this.add(10, 20); // 显式调用成员方法(等价于直接写 add(10, 20))
    }
}

2.4 this 调用构造器

场景
在构造器中,通过 this(参数) 调用同类中的其他构造器(必须写在构造器的第一行)。

示例

public class Book {
    String title;
    String author;

    public Book() {
        this("未命名", "未知作者"); // 调用有参构造器
    }

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }
}

2.5 注意事项
  1. 作用域限制

    • this 只能在非静态方法或构造器中使用不能在静态方法中使用
  2. 避免滥用

    • 当成员变量与局部变量无冲突时,可省略 this,提高代码简洁性。
  3. 链式调用

    • 通过返回 this 实现方法的链式调用。
    public class Student {
        String name;
        int age;
    
        public Student setName(String name) {
            this.name = name;
            return this; // 返回当前对象
        }
    
        public Student setAge(int age) {
            this.age = age;
            return this;
        }
    }
    
    // 链式调用示例
    Student s = new Student().setName("张三").setAge(20);
    

2.6 内存视角下的 this

对象调用过程

  • 当对象调用方法时,JVM 会隐式传递 this 参数,指向堆内存中的对象实例。

示例

Student s = new Student();
s.setName("李四"); 

内存分配

| 内存区域 | 存储内容                          |
|----------|-----------------------------------|
| 堆内存   | Student对象:name="李四"          |
| 栈内存   | 变量 s 存储堆内存地址(如0x4f3f5b24) |

setName 方法中,this 指向堆内存中的对象实例。


2.7 总结
  • 核心功能
    • 解决成员变量与局部变量同名时的访问冲突。
    • 支持构造器和方法间的链式调用。
  • 使用规范
    • 显式使用 this 提高代码可读性,尤其在变量名冲突时。
    • 合理利用 this() 简化构造器代码。
  • 高级技巧
    • 结合链式调用设计流畅接口(Fluent API)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值