第03周 预习、实验与作业:面向对象入门2与类的识别

1.什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗?

答:(1)在Java中,是否使用static修饰一个方法取决于该方法是否需要访问类的非静态成员(如字段、方法等)或者该方法是否设计为与类的任何特定实例无关。        

应该使用static修饰的方法

        a.工具方法:当方法执行的任务不依赖于类的任何特定实例,而是执行一些通用的、静态的、不改变实例状态的操作时,应该使用static修饰。例如,数学运算、文件操作等。

        b.工厂方法:在创建类的实例时,如果创建逻辑较为复杂,可以通过静态方法(也称为工厂方法)来封装创建逻辑,使得外部代码能够更简洁地获取实例。

        c.访问静态字段:如果方法需要访问或修改类的静态字段,那么这个方法也应该是静态的。

不用static修饰的方法的特性

        a.实例依赖:非静态方法依赖于类的某个具体实例。这意味着,在调用非静态方法之前,必须先创建类的实例。

        b.可以访问实例变量:非静态方法可以访问和操作类的实例变量(即非静态字段)。

        c.多态性:非静态方法可以被重写(在子类中),这是实现多态性的关键。

StudentgetName方法应该用static修饰吗?

  getName应该是一个非静态方法,因为它依赖于特定的Student实例来获取数据。如果你试图将getName声明为static,你将不得不传递一个Student实例(或其他标识)作为参数来指定你想获取哪个学生的名字,这在大多数情况下是不必要的,并且违反了面向对象的设计原则。

2.购物车案例中,使用了什么方法将问题描述中的类、方法、属性找出来?方法与属性到底属于哪个类,要怎么判定呢?

答:

识别实体和概念

首先,从问题描述中识别出所有的实体和概念。在购物车案例中,常见的实体包括:

(1)用户(User):购物的主体,可能有用户名、密码、地址等属性。

(2)商品(Product):被购买的物品,可能有名称、价格、库存量等属性。

(3)购物车(Cart):存放用户选择购买的商品,可能有商品列表、总价等属性。

确定类的属性

对于每个实体,确定其相关的属性。属性是描述实体特征的数据

  • User类
    • 属性:用户名(username)、密码(password)、地址(address)等。
  • Product类
    • 属性:产品ID(id)、名称(name)、价格(price)、库存量(stock)等。
  • Cart类
    • 属性:购物车ID(id,可选,取决于是否需要跨会话跟踪)、商品列表(products,通常是一个包含Product对象的列表)、总价(totalPrice)等。

确定类的方法

方法定义了类可以执行的操作。它们通常与类的属性紧密相关,用于修改属性、提供信息或执行与类相关的业务逻辑。

  • User类
    • 方法:登录(login)、注册(register)、更新地址(updateAddress)等。
  • Product类
    • 方法:获取价格(getPrice)、设置价格(setPrice,虽然在实际应用中可能不常见,但理论上存在)、检查库存(checkStock)等。
  • Cart类
    • 方法:添加商品(addItem)、移除商品(removeItem)、计算总价(calculateTotalPrice)、清空购物车(clearCart)等。

判定方法与属性所属类

  • 属性所属类:属性直接描述的是哪个实体,就属于哪个类。例如,价格(price)是描述商品的特征,所以它是Product类的属性。
  • 方法所属类:方法执行的操作与哪个类的实例紧密相关,就属于哪个类。例如,添加商品到购物车是购物车(Cart)的功能,所以addItem方法是Cart类的方法。

3.一个项目中有很多类。怎样才能避免你项目中的类与别人编写的类同名呢?项目中类各种各样要怎么管理这些代码呢?举例说明。

答:

(1)命名规范

命名约定:采用一致的命名规范是避免类名冲突的第一步。例如,可以使用公司的名称缩写或项目名称作为命名空间的一部分。例如,如果公司名称是“ABC Corp”,那么所有的类名可以前缀为AbcCorp或更具体的AbcCorp.ProjectName

包结构:在Java、C#等语言中,使用包(或命名空间)来组织类是一个很好的实践。不同的功能或模块可以放在不同的包中,这样即使类名相同,只要它们在不同的包中,就不会产生冲突。

(2)依赖管理

使用依赖管理工具:如Maven、Gradle(Java)、NuGet(.NET)、npm(JavaScript)等。这些工具不仅可以帮助你管理项目依赖的库,还能解决库之间的版本冲突问题。

隔离第三方库:将项目中使用的第三方库放在特定的包或命名空间中,以减少与你自己代码的冲突。

(3) 模块化

模块化开发:将项目拆分成多个模块或组件,每个模块或组件负责特定的功能。这样不仅可以提高代码的可重用性,还能减少不同模块之间的依赖,降低类名冲突的风险。

(4) 代码审查

代码审查:定期进行代码审查,确保团队成员遵循命名规范和项目结构。这有助于在问题变得严重之前发现并解决问题。

(5)自动化工具

静态代码分析工具:使用静态代码分析工具来检查命名冲突、代码风格问题等。这些工具可以集成到持续集成/持续部署(CI/CD)流程中,自动检测潜在问题。

举例说明

假设你正在开发一个名为“Employee Management System”的项目,项目使用Java编写,你可以按照以下方式组织代码:

  • 包结构
    • com.abccorp.employeemanager:作为项目的根包。
      • com.abccorp.employeemanager.model:包含所有与模型(如Employee类)相关的类。
      • com.abccorp.employeemanager.service:包含所有服务层逻辑,如处理员工信息的服务。
      • com.abccorp.employeemanager.controller:包含所有与前端交互的控制器类。
      • com.abccorp.employeemanager.repository:包含所有与数据库交互的仓库接口。
  • 命名规范
    • 所有的类名都以大写字母开头,使用驼峰命名法(CamelCase)。
    • 对于接口,通常会在类名后添加Interface后缀(尽管这不是Java的强制要求,但有助于清晰表达)。
    • 使用枚举(Enum)来表示固定的值集合,如EmployeeStatus
  • 依赖管理
    • 使用Maven作为项目的构建和依赖管理工具。
    • pom.xml文件中定义项目依赖的库和版本。

4.阅读《阿里巴巴Java开发手册 终极版(1.3.0)》,写出至少7条Java编程规范。应包含如下几个方面:变量命名、类命名、方法命名、常量命名、包命名、代码格式、OOP规约。

答:

(1)变量命名

  • 规范:变量名以小写字母开始,使用驼峰命名法(camelCase)分隔单词。
  • 示例int maxCount = 10;
  • 说明:变量名应直观表达变量用途,避免使用单个字符(如i, j, k等)作为变量名,除非在for循环中作为索引使用。

(2) 类命名

  • 规范:类名使用大写字母开头的驼峰命名法(UpperCamelCase)。
  • 示例public class UserManager {}
  • 说明:类名应该简洁且能够描述类的职责。

(3)方法命名

  • 规范:方法名同样使用小写字母开头的驼峰命名法,但首字母根据是否是访问器(getter)、修改器(setter)或是否为动词来决定是否大写。
  • 示例public String getUserName() { ... }
  • 说明:方法名应准确描述方法的行为。

(4)常量命名

  • 规范:常量名应全部大写,单词之间用下划线(_)分隔。
  • 示例public static final int MAX_COUNT = 100;
  • 说明:常量用于表示不变的值,命名时应确保易读性。

(5)包命名

  • 规范:包名全部小写,点(.)分隔,有层次的按组织、项目、模块、功能等依次命名。
  • 示例com.alibaba.project.module.function
  • 说明:包名应反映项目的结构,便于理解和查找。

(6)代码格式

(7)OOP规约

  • 规范:大括号风格统一,建议使用K&R风格(左大括号不换行),或使用IDE的默认风格但保持团队内一致。
  • 示例
    public void someMethod() {  
        // 方法体  
    }
  • 规范:尽量使用接口(Interface)隐藏实现细节,多使用组合/聚合而非继承关系。
  • 示例:定义一个接口UserService,然后通过实现类UserServiceImpl来实现接口。
  • 说明:面向对象编程(OOP)的核心是封装、继承和多态。合理使用这些特性可以提高代码的模块性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值