目录
1.3Student的getName应该用static修饰吗?
2.1购物车案例中,使用了什么方法将问题描述中的类、方法、属性找出来?
3.1一个项目中有很多类。怎样才能避免你项目中的类与别人编写的类同名呢?项目中类各种各样要怎么管理这些代码呢?举例说明
1.类方法-static方法
static关键字用于修饰类的方法或变量,表示它们属于类本身,而不是类的某个特定实例。
1.1什么样的方法应该用static修饰?
(1)工具方法,不需要创建类的实例即可调用。如Math类
(2)修饰常量。一个方法的主要目的是返回一个常量,利用static有助于明确表明该方法不会修改任何实例状态
public class Constants { public static final double PI = 3.14159; public static double getPi() { return PI; } }
(3)初始化类级别的资源(AI)
当需要在类加载时初始化一些类级别的资源时,可以使用static方法,这在某些情况下可能是必要的,比如需要提前加载一些配置信息或初始化一些全局变量。
1.2不用static修饰的方法往往具有什么特性
如果一个方法需要访问或修改实例变量,或者其行为依赖于对象的状态,那么这个方法就不应该被声明为 static
(1)方法要通过创建对象并调用来实现具体功能
class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void introduceYourself() { System.out.println("Hello, my name is " + name + " and I am " + age + " years old."); } } public class demo01 { public static void main(String[] args) { Person person = new Person("gmy", 19); person.introduceYourself(); // 不使用 static } }
(2)方法修改实例变量
(3)行为随对象变化而变化
public class Vehicle { private String color; public Vehicle(String color) { this.color = color; } public String getColor() { return color; } } public class Main { public static void main(String[] args) { Vehicle car = new Vehicle("Red"); Vehicle bike = new Vehicle("Blue"); System.out.println(car.getColor()); // 不使用 static System.out.println(bike.getColor()); // 不使用 static } }
1.3Student的getName应该用static修饰吗?
不能。getName在调用的时候需要创建对象,名字随着对象的变化而变化。
class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName(){ return name; } } public class demo01 { public static void main(String[] args) { Person person = new Person("gmy", 19); Person person1 =new Person("hst",19); System.out.println(person.getName()); System.out.println(person1.getName()); } }
2.类的设计
2.1购物车案例中,使用了什么方法将问题描述中的类、方法、属性找出来?
(1)分析需求
(2)提取类
购物车(ShoppingCar)和商品(Product)
(3)提取属性
ShoppingCar类:
- entry:存储购物车中商品的列表
Product类:
- name:商品名称
- price:商品价格
- count:商品数量
(4)提取方法
ShoppingCar类:
- 添加商品
- 移除商品
- 获得商品列表
- 计算商品总价
ShoppingCar类
package shopping; import java.util.ArrayList; import java.util.List; public class ShoppingCar { private List<Product> entry; public ShoppingCar(){ this.entry=new ArrayList<>(); } public void addProduct(Product product){ entry.add(product); } public void removeProduct(Product product){ entry.remove(product); } public List<Product> getEntry(){ return entry; } public double calculateTotalPrice() { double total = 0; for (Product product : entry) { total += product.getPrice() * product.getCount(); } return total; } }
Product类
package shopping; public class Product { private String name; private double price; private int count; public Product(String name,double price,int count){ this.name = name; this.price = price; this.count = count; } public String getName(){ return name; } public double getPrice(){ return price; } public int getCount(){ return count; } }
测试代码(AI)
package shopping; import java.util.List; import java.util.List; public class ShoppingCarTest { public static void main(String[] args) { // 创建产品 Product apple = new Product("Apple", 1.5, 5); Product banana = new Product("Banana", 0.5, 10); Product orange = new Product("Orange", 0.75, 3); // 创建购物车 ShoppingCar cart = new ShoppingCar(); // 添加产品到购物车 cart.addProduct(apple); cart.addProduct(banana); cart.addProduct(orange); // 输出购物车中的产品列表 System.out.println("Products in the shopping cart:"); List<Product> productList = cart.getEntry(); for (Product product : productList) { System.out.println("Name: " + product.getName() + ", Price: " + product.getPrice() + ", Count: " + product.getCount()); } // 计算购物车总价 double totalPrice = cart.calculateTotalPrice(); System.out.println("Total price of the shopping cart: $" + totalPrice); // 从购物车中移除一个产品 cart.removeProduct(apple); // 再次输出购物车中的产品列表 System.out.println("After removing Apple:"); productList = cart.getEntry(); for (Product product : productList) { System.out.println("Name: " + product.getName() + ", Price: " + product.getPrice() + ", Count: " + product.getCount()); } // 再次计算购物车总价 totalPrice = cart.calculateTotalPrice(); System.out.println("New total price of the shopping cart: $" + totalPrice); } }
运行结果:
2.2方法与属性到底属于哪个类,要怎么判定呢?
根据职权和功能判定,
ShoppingCar
类的主要职责是管理购物车中的商品,因此与购物车管理相关的操作(如添加商品、删除商品、计算总价等)应该属于ShoppingCar
类。
3.使用包管理类-包装制
3.1一个项目中有很多类。怎样才能避免你项目中的类与别人编写的类同名呢?项目中类各种各样要怎么管理这些代码呢?举例说明
使用包管理类,有点像使用目录组织管理文件。包装制可以将一组相关的类,接口组织起来,提供访问控制,命名空间管理功能。
例如购物车案例:
4.Java编程规范
(1)变量命名:变量名应使用完整的英文单词,禁止使用缩写,以增加代码的可读性
(2)类命名:类名使用大写字母开头的完整英文单词或词组,禁止使用缩写,类名应当能准确反映类的职责
(3)方法名:方法名应采用动词或动宾短语,且首字母小写,其余单词首字母大写
(4)常量:常量名全部大写,单词间用下划线分
(5)包名:
- 全部采用小写
- 包含创建者,项目,模块等信息
- 如果是公司的话,采用公司的反向域名
- 例子:jmu.edu——>edu.jmu.netresearch.util
(6)代码格式:代码块应当缩进 4 个空格,禁止使用 Tab 字符;每行代码长度不超过 120 个字符;方法参数之间用逗号分隔;大括号的使用要一致,推荐 K&R 样式。
(7)OOP规约:类应当尽可能使用组合而非继承的方式进行扩展;类的职责单一,避免过大过胖;遵循 SOLID 原则(单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则)。(AI)