Java课前问题列表-面向对象入门2与类的识别
1.关于static修饰
什么样的方法应该用 static 修饰?
答:
当一个方法满足以下条件时,应该考虑使用 static 修饰:
- 不依赖于特定对象的实例状态:方法的行为不依赖于或修改其所属类的任何实例变量(非静态字段)。它的执行只依赖于其传入的参数。
- 工具类或辅助方法:常用于定义工具类(如 Math 类中的 sqrt, max 方法)或辅助方法(如数据转换、格式校验等)。
- 工厂方法:用于创建并返回类的实例,例如 Calendar.getInstance()。
- 全局常量访问器:用于返回静态常量。
核心思想:如果一个方法没有“状态”的概念(即不操作属于某个具体对象的数据),它就可以是静态的。
不用 static 修饰的方法往往具有什么特性?
答:
非静态方法(实例方法)通常具有以下特性:
- 依赖于对象实例:必须通过类的实例(对象)来调用(object.method())。
- 操作实例变量:方法内部可以访问和修改该对象的实例变量(非静态字段),其行为会因对象状态的不同而不同。
- 代表对象的行为:描述了对象能做什么,是对象功能的核心体现。例如,一个 Dog 对象的 bark() 方法。
Student 的 getName 应该用 static 修饰吗?
答:
绝对不应该:原因:getName 方法的目的是返回某个特定 Student 对象的姓名。姓名(name)是 Student 类的一个实例变量(属性),每个 Student 对象的 name 值都可能不同。getName 方法的行为完全依赖于调用它的那个具体对象的状态,这正是一个 典型的实例方法的特征。如果将其设为 static,调用方式将变为 Student.getName(),这意味着该方法不属于任何特定的学生对象,它无法知道应该返回哪个学生的名字,这在逻辑上是完全错误的。
- 购物车案例中的类、方法、属性识别与管理
使用了什么方法将问题描述中的类、方法、属性找出来?
答:
这个过程通常使用名词动词法,是面向对象分析(OOA)的一种简单有效的技巧。
- 识别类(Class):阅读问题描述,找出其中的名词或名词短语。这些名词通常就是潜在的类。例如,在购物车描述中,你会找到“用户”、“商品”、“购物车”、“订单”、“订单项”等名词,它们都是候选类。
- 识别属性(Attribute):对于识别出的每个类,继续分析描述,找出描述这个名词的修饰性名词或形容词。这些就是类的属性。例如,“商品”有“价格”、“名称”、“库存”等属性。“用户”有“姓名”、“地址”等属性。
- 识别方法(Method):阅读问题描述,找出其中的动词。这些动词通常代表了对象的行为,也就是方法。哪个对象执行了这个动作,这个方法就属于哪个类。例如,“用户”“添加商品”到“购物车”,那么“添加”这个动词就是 ShoppingCart 类的一个方法(如 addItem(Product product))。“购物车”“计算总价”,那么“计算”就是 ShoppingCart 的 calculateTotal() 方法。
方法与属性到底属于哪个类,要怎么判定呢?
答:
判定归属的核心原则是职责驱动设计和信息专家模式。
属性归属:一条信息(数据)主要是由哪个类拥有或使用的?这个属性就应该属于那个类。例如,“价格”是描述“商品”的核心特征,所以 price 属性属于 Product 类,而不属于 ShoppingCart。
方法归属:一个操作(动作)主要是由哪个对象执行的?或者,完成这个操作所需要的大部分数据(属性)存储在哪个对象里?这个方法就应该属于那个类。
举例1:addItem 方法。虽然是用户发出的指令,但实际被修改(添加商品)的是购物车对象,并且需要访问购物车内部的商品列表,所以 addItem 应属于 ShoppingCart 类。
举例2:calculateTotal 方法。计算总价需要遍历购物车中的所有商品(Product 对象)并获取它们的价格(price)。因为购物车持有商品列表,所以由 ShoppingCart 来负责计算总价是最合理的,它是完成这个任务的“信息专家”。
- 类的命名冲突与管理
怎样才能避免你项目中的类与别人编写的类同名呢?
答:
使用 包(Package)。包是Java中用来避免命名冲突、组织和管理类的机制。它提供了命名空间(Namespace) 的功能。做法:使用一个全球唯一的包名。最常见的做法是使用你所在公司或组织的互联网域名倒序作为包的前缀。例如,如果你的公司域名是 google.com,那么你的项目包名就可以是 com.google.项目名.模块名。这样,即使你和另一个公司都写了一个 User 类,它们的完整限定名(Fully Qualified Name)也会是不同的:com.companyA.project.User 和 com.companyB.project.User。Java虚拟机(JVM)和编译器会将它们视为完全不同的两个类。
项目中类各种各样要怎么管理这些代码呢?举例说明。
答:
通过包和目录结构来进行逻辑和物理上的分层管理。
按照功能和职责将类分门别类地放入不同的包中。一个典型的中大型项目结构如下:
src
└── com└── company└── ecommerce├── model // 模型层(或称实体层):存放数据模型类,如User, Product, Order│ ├── User.java│ ├── Product.java│ └── Order.java├── dao // 数据访问层(DAO):负责与数据库交互,如UserDao, ProductDao│ ├── UserDao.java│ └── ProductDao.java├── service // 业务逻辑层:包含核心业务逻辑,如UserService, OrderService│ ├── UserService.java│ └── OrderService.java├── controller // 控制层(如Web控制器):处理HTTP请求和响应│ ├── UserController.java│ └── ProductController.java└── util // 工具包:存放各种工具类,如StringUtil, DateUtil├── StringUtil.java└── DateUtil.java
这种分层的包结构使得代码:
高内聚低耦合:相同功能的类放在一起,不同层次的类通过接口交互,减少依赖。
易于维护和定位:开发者能快速找到特定功能的代码。
易于授权和协作:不同的团队或开发者可以负责不同的模块(包)。
- 《阿里巴巴Java开发手册》编程规范(至少7条)
以下规则摘自《阿里巴巴Java开发手册》,并涵盖了要求的方面:
- 变量命名:【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例:name / name / $name / name / name$ / name - 类命名:【强制】类名使用 UpperCamelCase(大驼峰)风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。
正例:UserDAO, HtmlEscape, XmlService, TcpUdpDeal - 方法命名:【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase(小驼峰)风格。
正例:localValue / getHttpMessage() / inputUserId - 常量命名:【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
正例:MAX_STOCK_COUNT
反例:MAX_COUNT - 包命名:【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
正例:application.utils, com.alibaba.ei.kunlun.aop - 代码格式 - 大括号:【强制】如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码块,则:
左大括号前不换行,左大括号后换行。
右大括号前换行,右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。 - OOP规约 - 对象比较:【强制】所有相同类型的包装类对象之间值的比较,全部使用 equals() 方法。
说明:对于 Integer var = ? 在 -128 至 127 范围内的赋值,Integer 对象在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用 == 进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象。所以推荐使用 equals 方法进行判断。
反例:if (x == y) // 如果 x 和 y 是超过127的 Integer 对象,结果永远为 false - OOP规约 - 字符串比较:【强制】所有字符串之间值的比较,全部使用 equals() 方法。
说明:== 比较的是地址,equals 比较的是内容。 - OOP规约 - 静态方法调用:【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908805.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!