学习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;
        }
    }
相关推荐
QiZhang | UESTC1 天前
学习日记day45
学习
菜鸟‍1 天前
【论文学习】通过编辑习得分数函数实现扩散模型中的图像隐藏
人工智能·学习·机器学习
梦未1 天前
Spring控制反转与依赖注入
java·后端·spring
喜欢流萤吖~1 天前
Lambda 表达式
java
知识分享小能手1 天前
CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 配置网络功能 —语法详解与实战案例(10)
网络·学习·centos
ZouZou老师1 天前
C++设计模式之适配器模式:以家具生产为例
java·设计模式·适配器模式
瑶光守护者1 天前
【学习笔记】5G RedCap:智能回落5G NR驻留的接入策略
笔记·学习·5g
你想知道什么?1 天前
Python基础篇(上) 学习笔记
笔记·python·学习
曼巴UE51 天前
UE5 C++ 动态多播
java·开发语言
SHOJYS1 天前
学习离线处理 [CSP-J 2022 山东] 部署
数据结构·c++·学习·算法