学习Java23天

就近原则(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. 区分同名变量:明确引用当前对象的成员变量

  2. 调用本类方法:调用当前对象的其他方法

  3. 调用构造方法:在构造方法中调用其他构造方法

使用场景

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 类名(参数列表) {
        // 初始化代码
    }
}

构造方法特点

  1. 名称相同:方法名必须与类名完全相同(大小写一致)

  2. 没有返回值:连void都不写

  3. 系统调用:由JVM在创建对象时自动调用

  4. 不可手动调用:不能像普通方法那样调用

执行时机

java

复制代码
// 创建对象时自动调用构造方法
Student stu = new Student();  // 调用无参构造
Student stu2 = new Student("张三", 20);  // 调用有参构造

构造方法注意事项

默认构造方法

  1. 未定义构造方法:编译器自动提供无参构造

  2. 已定义构造方法:不提供默认构造

  3. 重要规则:一旦定义任何构造方法,系统不再提供默认构造

构造方法重载

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;
    }
}

推荐使用方式

  1. 始终显式定义无参构造

  2. 提供常用参数组合的构造方法

  3. 考虑使用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());
    }
}

最佳实践总结

  1. 坚持封装原则:所有成员变量都用private修饰

  2. 规范构造方法:至少提供无参和全参构造

  3. 正确使用this:在需要区分时使用this关键字

  4. 完整JavaBean:包含getter、setter和必要的业务方法

  5. 添加验证逻辑:在setter方法中验证数据有效性

  6. 实现toString:便于调试和日志输出

    java 复制代码
    public 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;
        }
    }
相关推荐
Tony Bai1 天前
高并发后端:坚守 Go,还是拥抱 Rust?
开发语言·后端·golang·rust
wjs20241 天前
Swift 类型转换
开发语言
没有bug.的程序员1 天前
服务安全:内部服务如何防止“裸奔”?
java·网络安全·云原生安全·服务安全·零信任架构·微服务安全·内部鉴权
一线大码1 天前
SpringBoot 3 和 4 的版本新特性和升级要点
java·spring boot·后端
秃了也弱了。1 天前
python实现定时任务:schedule库、APScheduler库
开发语言·python
YJlio1 天前
VolumeID 学习笔记(13.10):卷序列号修改与资产标识管理实战
windows·笔记·学习
weixin_440730501 天前
java数组整理笔记
java·开发语言·笔记
小龙1 天前
【学习笔记】多标签交叉熵损失的原理
笔记·学习·多标签交叉熵损失
weixin_425023001 天前
Spring Boot 实用核心技巧汇总:日期格式化、线程管控、MCP服务、AOP进阶等
java·spring boot·后端
一线大码1 天前
Java 8-25 各个版本新特性总结
java·后端