第5章-第6节-Java中的权限修饰符以及方法toString、equals

本文介绍了Java中的权限修饰符(private,default,protected,public)以及Object类中的toString和equals方法在实际开发中的重要性和重写技巧。着重说明了在自定义类中如何重写这些方法以获取对象属性信息而非地址。

1、权限修饰符:Java语言一共有4种

①.private:         私有的
②.缺省:            默认的
③.protected:    受保护的
④.public:          公共的


权限关系图:

                     本类中        同包不同类        跨包子父类        跨包非子父类

private           √                 ×                       ×                        ×

缺省               √                 √                       ×                        ×

protected       √                 √                       √                         ×

public             √                 √                       √                         √


大小关系梳理:
    
    private   <   缺省   <   protected   <   public

总结:
    Java中权限修饰符有4种,但是在实际开发场景下主要就使用两种:private、public


2、Object类中的两个常用方法:

1)、toString

String toString():返回该对象的字符串表示。 

作用:得到对象的属性/数据信息内容

实例化对象完毕后,直接在打印语句内部输出打印对象名,会有一个隐式调用toString方法的环节存在;
查看Object类中toString方法的源代码得知,返回的是对象的地址信息内容;
实际开发环境下,地址信息对于我们意义不大,我们更关心、更想要得到的是对象的属性信息内容;
面临的问题如下:
    Object类中的toString方法我需要使用它,但是方法体的逻辑不适合 ==> 重写它

在实际开发环境下,重写toString方法是非常普遍的,所以idea和eclipse等软件中都提供了快速重写toString的方式;
idea中重写toString的快捷方式如下:
    alt + insert -> Generate toString -> ...

【注意】:

jdk核心类库中的第三方类都已经重写过了toString方法,不需要我们关注重写问题;
对于我们的自定义类,则需要考虑是否要重写toString方法;


2)、equals

boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。 

作用:
    比较对象之间长的"像"不"像"    ==>    对象之间的属性信息内容是否一致

实例化两个对象,我们需要比较两个对象长的"像"不"像" ==> 属性信息内容是否一致;
此时如果使用==进行比较,则比较的是对象的地址是否一致,明显不太合适;
我们考虑使用equals方法,查看Object类中equals方法的源代码得知,比较的仍然是地址;
面临的问题如下:
    Object类中的equals方法我需要使用它,但是方法体的逻辑不适合 ==> 重写它

在实际开发环境下,对于自定义类重写equals方法是非常普遍的,所以idea/eclipse中都定义了快捷重写equals方法的方式;
idea快速重写equal方法的方式如下:
    alt + insert -> Generate equals and hasCode -> ...

【注意】:

jdk核心类库中的第三方类都已经重写过了equals方法,不需要我们关注重写问题;
对于我们的自定义类,则需要考虑是否要重写equals方法;

重写equals思路:如果传进来的对象和this地址相同那么返回true,如果传进来的对象是null那么返回false,如果传进来的对象的实际对象类型不同那么返回false(这里用instanceof),最后再去分别判断对象的每个属性是否相同,全同相等就返回true否则返回false。

本电子书目录:《Java基础的重点知识点全集》 

<think>在Java中,类定义的代码块通常按照以下顺序组织:1.包声明(如果存在)2.导入语句(如果存在)3.类注释(可选)4.类定义4.1成员变量(属性)4.2构造方法4.3方法(包括Setter、Getter以及其他方法)而在同一个文件中的多个类,一般来说,只能有一个public类,且该public类必须与文件名相同。其他类可以是非public的,并且放在public类的后面。但是,对于测试类,通常建议独立于主类定义,即放在另一个文件中。如果放在同一个文件中,则测试类不能是public的(因为一个文件中只能有一个public类)。然而,在教学中或者简单的示例中,有时会将测试类和主类放在同一个文件中,此时测试类不使用public修饰。下面我们按照规范写一个示例,展示在同一个文件中如何组织代码(注意:这种写法不推荐用于实际项目,实际项目中测试类应单独成文件)。</think> # Java代码块组织规范与顺序详解 在Java程序中,类定义、构造方法和测试类应该遵循特定的组织顺序以提高代码可读性和可维护性。以下是标准的代码块放置顺序: ## 标准Java类组织顺序 ```java // 1. 包声明 (必需,放在文件顶部) package com.example.project; // 2. 导入语句 (必需,放在包声明后) import java.util.List; import java.util.ArrayList; /** * 3. 类注释/文档 (推荐) * 这是用户类,用于表示系统用户信息 */ // 4. 类定义 (必需) public class User { // 5. 静态常量 (可选) private static final int MAX_AGE = 150; // 6. 成员变量 (必需) private String username; private String password; private String email; // 7. 静态块 (可选) static { // 静态初始化代码 } // 8. 构造方法 (必需) public User() { // 无参构造 } public User(String username, String password) { this.username = username; this.password = password; } // 9. Getter/Setter方法 (推荐) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } // 10. 业务方法 public void displayInfo() { System.out.println("用户: " + username + ", 邮箱: " + email); } // 11. toString/equals/hashCode (可选) @Override public String toString() { return "User{" + "username='" + username + '\'' + ", email='" + email + '\'' + '}'; } // 12. 内部类 (可选) private class LoginHistory { // 内部类成员 } } // 13. 测试类 (通常放在单独文件中,但简单示例可放同文件) class UserTest { public static void main(String[] args) { // 测试代码 User user = new User("user1", "pass123"); user.setEmail("user1@example.com"); user.displayInfo(); } } ``` ## 详细解释与最佳实践 ### 1. 包声明 ```java package com.example.project; ``` - **位置**:文件第一行 - **作用**:定义类的命名空间 - **规则**:全部小写,公司域名的反转形式 ### 2. 导入语句 ```java import java.util.List; ``` - **位置**:包声明后,类定义前 - **顺序**: 1. Java标准库 (java.xxx) 2. 第三方库 (org.apache.xxx) 3. 同一项目其他包 4. 静态导入 (import static) - **最佳实践**:避免使用通配符 (*) 导入 ### 3. 类定义 ```java public class User { ``` - **访问修饰符顺序**: 1. `public` 2. `protected` 3. `private` 4. `abstract` 5. `static` 6. `final` 7. `transient` 8. `volatile` 9. `synchronized` 10. `native` 11. `strictfp` ### 4. 成员变量 ```java private String username; ``` - **放置顺序**: 1. 静态常量 (`public static final`) 2. 静态变量 (`private static`) 3. 实例常量 (`private final`) 4. 实例变量 - **推荐访问权限**:优先使用 `private` ### 5. 构造方法 ```java public User(String username, String password) { ``` - **放置顺序**: 1. 默认构造方法 2. 参数由少到多 3. 复制构造方法 - **原则**:避免重复代码,通过`this()`调用其他构造方法 ### 6. 方法组织 ```java public void displayInfo() { ``` - **方法顺序**: 1. 构造方法 2. Getter/Setter方法 3. 核心业务方法 4. 重写方法 (toString/equals/hashCode) 5. 工具/辅助方法 - **最佳实践**: - 公共方法在前,私有方法在后 - 相关功能的方法分组在一起 ### 7. 测试类 ```java class UserTest { public static void main(String[] args) { ``` - **位置原则**: - 生产环境中:独立文件(如`User.java`和`UserTest.java`) - 教学/简单示例:可在同一文件但必须是不同的类 - **命名规范**:`[被测类名]Test`(如`UserTest`) - **框架建议**:使用JUnit等测试框架代替main方法 ## 为什么顺序很重要? 1. **可读性**:一致的代码结构便于快速理解 2. **可维护性**:规范组织减少混乱 3. **协作性**:统一标准便于团队合作 4. **可发现性**:开发者可以快速定位代码位置 5. **错误预防**:逻辑分组减少代码冲突 ## 扩展案例:符合规范的类示例 ```java package com.example.auth; import java.time.LocalDate; /** * 用户实体类,包含认证信息 */ public class User { // 静态常量 public static final int MIN_PASSWORD_LENGTH = 8; // 成员变量 private String username; private String password; private String email; private LocalDate registerDate; // 构造方法 public User() { this.registerDate = LocalDate.now(); } public User(String username, String password) { this(); this.username = username; this.password = password; } // Getter/Setter public String getUsername() { return username; } public void setUsername(String username) { if(username != null && username.length() >= 3) { this.username = username; } } // 业务方法 public boolean validatePassword(String input) { return this.password.equals(input); } // 重写方法 @Override public String toString() { return "User{" + "username='" + username + '\'' + ", email='" + email + '\'' + ", registerDate=" + registerDate + '}'; } // 辅助方法 private void encryptPassword() { // 密码加密逻辑 } } // 单独文件:UserTest.java package com.example.auth; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class UserTest { @Test void testCreateUser() { User user = new User("john_doe", "secret123"); user.setEmail("john@example.com"); assertEquals("john_doe", user.getUsername()); assertTrue(user.validatePassword("secret123")); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zwarwolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值