编程自学指南:java程序设计开发,Java this 关键字详解课件
一、课程信息
学习目标
- 理解 this 的核心本质:当前对象的引用
- 掌握 this 的四大核心用法(区分变量、调用构造器、方法链式调用、传递对象)
- 能通过 this 写出简洁安全的代码,避免变量命名冲突
- 理解 this 不能在静态上下文中使用的原因
二、课程导入:生活中的 "自己"
🌰 场景模拟:学生自我介绍
- 每个学生对象有
name
和age
属性 - 当调用
introduce()
方法时,需要明确是 "自己" 的属性:public void introduce() { System.out.println("我是" + name + ",今年" + age + "岁"); // 这里的name和age默认省略了this. }
- 思考:如果方法参数名与属性名冲突,如何区分?
三、this 的本质:当前对象的引用
1. 内存角度理解
- 当对象调用方法时,JVM 会将对象的引用赋值给隐藏的
this
变量 - 示例:
java
Student stu = new Student("张三", 18); stu.introduce(); // 等价于 Student.introduce(stu),this指向stu对象
2. 打印 this 验证
class Student {
private String name;
public Student(String name) {
this.name = name;
System.out.println("构造方法中的this:" + this);
}
public void sayHello() {
System.out.println("方法中的this:" + this);
}
}
// 输出:
// 构造方法中的this:Student@1540e19d
// 方法中的this:Student@1540e19d(同一个对象)
四、this 的四大核心用法
🔧 用法 1:区分成员变量与局部变量(重点)
场景:当方法参数名与成员变量同名时
class Person {
private String name; // 成员变量
private int age;
// 局部变量name和age与成员变量同名
public Person(String name, int age) {
this.name = name; // 左边是成员变量,右边是局部变量
this.age = age;
}
public void setAge(int age) {
this.age = age; // 区分成员变量age和参数age
}
}
错误示范:
public Person(String name, int age) {
name = name; // ❌ 赋值给自己,成员变量未初始化
age = age;
}
🔧 用法 2:在构造器中调用其他构造器(代码复用)
规则:
- 只能在构造器中使用
this(参数列表)
- 必须位于构造器的第一行
- 不能形成递归调用
示例:阶梯式构造器
class Book {
private String title;
private String author;
private double price;
// 基础构造器
public Book(String title) {
this.title = title;
System.out.println("调用单参构造器");
}
// 调用单参构造器
public Book(String title, String author) {
this(title); // 必须第一行
this.author = author;
System.out.println("调用双参构造器");
}
// 调用双参构造器
public Book(String title, String author, double price) {
this(title, author);
this.price = price;
System.out.println("调用全参构造器");
}
}
// 测试:
new Book("Java编程", "张三", 59.9);
// 输出:
// 调用单参构造器
// 调用双参构造器
// 调用全参构造器
🔧 用法 3:方法链式调用(提高代码可读性)
场景:连续设置对象属性时
class User {
private String name;
private int age;
public User setName(String name) {
this.name = name;
return this; // 返回当前对象
}
public User setAge(int age) {
this.age = age;
return this;
}
public void printInfo() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
// 链式调用:
new User()
.setName("李四")
.setAge(20)
.printInfo(); // 输出:姓名:李四,年龄:20
🔧 用法 4:传递当前对象
场景:将当前对象作为参数传递给其他方法
class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
public void introduceTo(Teacher other) {
System.out.println(other.name + "老师,你好!我是" + this.name);
}
public void callIntroduce() {
Teacher mathTeacher = new Teacher("王老师");
introduceTo(mathTeacher); // 传递mathTeacher对象
introduceTo(this); // 传递当前对象(自己)
}
}
// 测试:
new Teacher("李老师").callIntroduce();
// 输出:
// 王老师,你好!我是李老师
// 李老师,你好!我是李老师(自己和自己打招呼)
五、初学者必避的 3 大误区
误区 1:在静态方法中使用 this
class Test {
static void staticMethod() {
System.out.println(this); // ❌ 编译错误!
}
}
原因:静态方法属于类,不属于任何对象,没有当前对象引用
误区 2:构造器中调用顺序错误
public Book(String title, String author) {
this.price = 0; // 先赋值
this(title); // ❌ 必须放在第一行
}
误区 3:方法链忘记返回 this
public User setName(String name) {
this.name = name;
// 忘记写return this;
}
// 调用时会报错:setAge() cannot be called on void
六、课堂练习
练习 1:完善 Student 类
需求:
- 包含
name
和score
属性 - 提供无参构造器(默认姓名 "无名氏",分数 0)
- 提供全参构造器
- 无参构造器通过
this()
调用全参构造器
参考实现:
class Student {
private String name;
private int score;
public Student() {
this("无名氏", 0); // 调用全参构造器
}
public Student(String name, int score) {
this.name = name;
this.score = score;
}
}
练习 2:用 this 实现计数器
需求:
- 每次创建对象时,计数器加 1
- 通过
getCount()
方法获取总对象数
提示:使用静态变量 + this 配合
七、课程总结
知识图谱:
this关键字 → 当前对象的引用
↳ 区分变量:this.成员变量
↳ 调用构造器:this(参数)(第一行)
↳ 方法链:return this
↳ 传对象:作为参数传递
口诀记忆:
“this 代表我自己,变量冲突靠它解,
构造调用放首行,方法连缀要返回,
静态方法不能用,牢记它是对象级!”
八、课后作业
必做 1:实现用户信息链式设置
需求:
- 定义
User
类,包含id
、name
、email
属性 - 每个
setter
方法返回this
- 主方法中用链式调用设置并打印信息
必做 2:用 this 解决命名冲突
场景:
- 定义
Circle
类,构造器参数名为radius
- 成员变量也叫
radius
- 提供计算面积的方法