学习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;
        }
    }
相关推荐
Leo July1 天前
【Java】Spring Security 6.x 全解析:从基础认证到企业级权限架构
java·spring·架构
wrj的博客1 天前
python环境安装
python·学习·环境配置
优雅的潮叭1 天前
c++ 学习笔记之 chrono库
c++·笔记·学习
星火开发设计1 天前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
码道功成1 天前
Pycham及IntelliJ Idea常用插件
java·ide·intellij-idea
TTGGGFF1 天前
控制系统建模仿真(一):掌握控制系统设计的 MAD 流程与 MATLAB 基础运算
开发语言·matlab
星幻元宇VR1 天前
走进公共安全教育展厅|了解安全防范知识
学习·安全·虚拟现实
消失的旧时光-19431 天前
第四篇(实战): 订单表索引设计实战:从慢 SQL 到毫秒级
java·数据库·sql
2501_944424121 天前
Flutter for OpenHarmony游戏集合App实战之贪吃蛇食物生成
android·开发语言·flutter·游戏·harmonyos
知识分享小能手1 天前
Oracle 19c入门学习教程,从入门到精通, Oracle 表空间与数据文件管理详解(9)
数据库·学习·oracle