1. 关于 static 修饰符
应该用 static 修饰的方法:
*不依赖于特定对象的实例状态:执行的操作不访问或修改对象的实例变量。
*工具类方法:常用于定义工具类中的方法,这些方法提供通用功能,无需创建类实例。
*工厂方法:用于创建并返回类的新实例。
*主方法:程序的入口点 main 方法必须是静态的,因为它在任何对象创建之前就被JVM调用。
不用 static 修饰的方法往往具有的特性:
*依赖于对象实例:它们必须通过类的实例来调用。
*操作对象的状态:它们可以访问和修改该对象的实例变量,代表了对象的行为或功能。
*与特定对象相关:方法的行为或结果可能因对象的状态不同而不同。
Student 的 getName 应该用 static 修饰吗?
答:不应该。getName 方法的目的是返回某个特定 Student 对象的姓名,每个 Student 对象的姓名都可能不同。这个方法强烈依赖于特定对象的状态,因此它必须是一个实例方法。
public class Student {private String name; // 实例变量,每个Student对象都有自己的name// 这是一个实例方法,必须通过对象调用,如 stu.getName()public String getName() {return this.name;}
// 如果错误地声明为static,会出现编译错误或逻辑错误
// public static String getName() {
//return name;
// 错误!静态方法无法访问非静态变量name
}
}
2. 购物车案例中的面向对象分析与设计
使用了什么方法将问题描述中的类、方法、属性找出来?
寻找类和属性:找出描述中的名词和名词短语。
*例如:“用户”、“商品”、“购物车”、“订单”、“价格”、“数量”等。
*“用户”、“商品”、“购物车”、“订单”是类。
*“价格”、“数量”是“商品”或“订单项”类的属性。
寻找方法:找出描述中的动词和动词短语。
*例如:“添加商品”、“查看购物车”、“计算总价”、“下单”等。
*“添加商品”是 ShoppingCart 类的一个方法。
*“计算总价”是 ShoppingCart 或 Order 类的一个方法。
方法与属性到底属于哪个类,要怎么判定呢?
判定归属的核心是职责驱动设计和信息专家模式:
信息专家模式:将职责(方法或属性)分配给拥有完成该职责所需信息的那个类。
问题:“谁拥有计算购物车总价所需的数据?”
答: ShoppingCart 对象拥有一个 List
高内聚低耦合:高:一个类应该专注于一个明确的职责,低:类与类之间不应过度依赖。
“商品”类的职责是管理商品信息,它不应该去处理购物车的逻辑。购物车的逻辑应该放在 ShoppingCart 类中。
简单来说就是:谁的数据,谁操作。
3. 类的命名与管理
怎样才能避免你项目中的类与别人编写的类同名呢?
*使用包,包是Java提供的命名空间机制,它就像是类的“姓氏”,可以有效避免命名冲突。
*使用唯一包名:通常采用域名倒写的规则来确保全球唯一性。
项目中类各种各样要怎么管理这些代码呢?举例说明。
*通过包和目录结构对类进行逻辑上的分门别类。这是一种物理上的代码组织方式。
*举例:一个电商项目
com.companyname.ecommerce (基包)
domain / model / entity:存放实体类(如 User, Product, Order, CartItem)
dao / repository:存放数据访问对象类,负责与数据库交互(如 UserDao, ProductRepository)
service:存放业务逻辑类(如 UserService, OrderService)
controller / web / servlet:存放Web层控制器类,处理HTTP请求(如 ProductController)
util:存放工具类(如 StringUtil, DateUtil)
config:存放配置类
exception:存放自定义异常类
(deepseek搜索)
这样,即使有100个类,也能通过清晰的包结构进行有效管理,方便查找和维护。
4.《阿里巴巴Java开发手册》编程规范
- 变量命名:代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反例:_name / _name / $name / name / name$
- 类命名:类名使用 UpperCamelCase风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。正例:UserDTO / XmlService / TcpUdpDeal
- 方法命名:方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase(小驼峰)风格。正例:localValue / getHttpMessage()
- 常量命名:常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。正例:MAX_STOCK_COUNT 反例:MAX_COUNT
- 包命名:包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式。正例:com.alibaba.ei.util
- 代码格式:如果是大括号内为空,则简洁地写成 {} 即可,不需要换行;如果是非空代码块,则:左大括号前不换行,后换行。右大括号前换行,后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
- OOP规约:所有 POJO 类属性必须使用包装数据类型。局部变量和方法参数使用基本数据类型。