就近原则(Local Variable Preference)
核心概念
当局部变量与成员变量同名时,Java会优先使用局部变量。
示例说明
java
public class Person {
private String name; // 成员变量
public void setName(String name) { // 参数name是局部变量
name = name; // 问题:哪个name?根据就近原则,都是参数name
// 实际上等于:参数name = 参数name,成员变量没有被赋值
}
}
this关键字
this的作用
-
区分同名变量:明确引用当前对象的成员变量
-
调用本类方法:调用当前对象的其他方法
-
调用构造方法:在构造方法中调用其他构造方法
使用场景
1. 区分成员变量和局部变量
java
public class Person {
private String name;
private int age;
// 使用this区分同名的成员变量和参数
public void setName(String name) {
this.name = name; // this.name指成员变量,name指参数
}
public void setAge(int age) {
this.age = age; // 明确赋值给成员变量
}
}
2. 调用本类其他方法
java
public class Calculator {
public void printResult() {
System.out.println("计算结果:" + calculate());
}
private int calculate() {
return 100;
}
public void show() {
this.printResult(); // 可以省略this,但加上更清晰
}
}
3. 调用其他构造方法
java
public class Student {
private String name;
private int age;
// 无参构造调用有参构造
public Student() {
this("未知", 0); // 调用下面的有参构造
}
// 有参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
构造方法(构造器)
构造方法定义
java
public class 类名 {
// 构造方法格式
public 类名(参数列表) {
// 初始化代码
}
}
构造方法特点
-
名称相同:方法名必须与类名完全相同(大小写一致)
-
没有返回值:连void都不写
-
系统调用:由JVM在创建对象时自动调用
-
不可手动调用:不能像普通方法那样调用
执行时机
java
// 创建对象时自动调用构造方法
Student stu = new Student(); // 调用无参构造
Student stu2 = new Student("张三", 20); // 调用有参构造
构造方法注意事项
默认构造方法
-
未定义构造方法:编译器自动提供无参构造
-
已定义构造方法:不提供默认构造
-
重要规则:一旦定义任何构造方法,系统不再提供默认构造
构造方法重载
java
public class Person {
private String name;
private int age;
// 无参构造
public Person() {
this.name = "未知";
this.age = 0;
}
// 单参构造
public Person(String name) {
this.name = name;
this.age = 0;
}
// 全参构造
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
推荐使用方式
-
始终显式定义无参构造
-
提供常用参数组合的构造方法
-
考虑使用this()调用其他构造方法减少重复代码
标准JavaBean类规范
完整规范要求
java
/**
* 标准JavaBean类示例
* 1. 类名见名知意(名词,首字母大写)
* 2. 私有成员变量
* 3. 提供无参构造和全参构造
* 4. 提供getter和setter方法
* 5. 可添加其他业务方法
*/
public class Student {
// ========== 1. 私有成员变量 ==========
private String name;
private int age;
private String gender;
// ========== 2. 构造方法 ==========
// 无参构造(必须提供)
public Student() {
}
// 带全部参数的构造方法(建议提供)
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
// ========== 3. Getter和Setter方法 ==========
public String getName() {
return name;
}
public void setName(String name) {
// 可添加验证逻辑
if (name != null && !name.trim().isEmpty()) {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
// 可添加验证逻辑
if (age >= 0 && age <= 120) {
this.age = age;
}
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
// 可添加验证逻辑
if ("男".equals(gender) || "女".equals(gender)) {
this.gender = gender;
}
}
// ========== 4. 其他方法(可选) ==========
// 显示学生信息
public void displayInfo() {
System.out.println("姓名:" + name + ",年龄:" + age + ",性别:" + gender);
}
// 判断是否成年
public boolean isAdult() {
return age >= 18;
}
// toString方法(重要,便于调试)
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
测试类示例
java
public class TestStudent {
public static void main(String[] args) {
// 使用无参构造创建对象
Student stu1 = new Student();
stu1.setName("张三");
stu1.setAge(20);
stu1.setGender("男");
stu1.displayInfo();
// 使用全参构造创建对象
Student stu2 = new Student("李四", 18, "女");
stu2.displayInfo();
// 使用toString方法
System.out.println(stu1.toString());
System.out.println(stu2); // 自动调用toString()
// 使用业务方法
System.out.println(stu1.getName() + "是否成年:" + stu1.isAdult());
}
}
最佳实践总结
-
坚持封装原则:所有成员变量都用private修饰
-
规范构造方法:至少提供无参和全参构造
-
正确使用this:在需要区分时使用this关键字
-
完整JavaBean:包含getter、setter和必要的业务方法
-
添加验证逻辑:在setter方法中验证数据有效性
-
实现toString:便于调试和日志输出
javapublic class User { //属性 private String username; private String password; private String email;; private int age; private String gender; //空参 public User(){ } //带全部参数的构造 public User(String username,String password,String email,int age,String gender){ this.username = username; this.password = password; this.email = email; this.age = age; this.gender = gender; } //get和set方法 public void setUsername(String username){ this.username = username; } public String getUsername(){ return username; } public void setPassword(String password){ this.password = password; } public String getPassword(){ return password; } public void setEmail(String email){ this.email = email; } public String getEmail(){ return email; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setGender(String gender){ this.gender = gender; } public String getGender(){ return gender; } }