2.5面向对象-static-枚举

本文详细介绍了Java中的static修饰符、final修饰符以及枚举的使用,包括static修饰成员变量的特点,final修饰的限制,以及枚举的引入、作用、语法和注意事项,帮助读者理解这些关键概念在编程中的实际应用。

目录

一、static修饰符

1.1static概念:关键字、修饰符、表示静态的

1.2修饰成员变量的方法

1.2.1static语句修饰后的特点

1.3变量的重新分类 

二、final修饰符

4.1 final概念

4.2 final作用:

三、枚举 

 3.1枚举的引入:

3.2枚举概述:

3.2.1什么是枚举

3.2.2枚举的作用和使用场景

3.2.3枚举的语法

3.4枚举注意事项


一、static修饰符

1.1static概念:关键字、修饰符、表示静态的

static修饰符可修饰的内容:

  1. 可以修饰普通方法

  2. 可以修饰字段[ 成员变量 ]

  3. 可以修饰内部类

  4. 不可以修饰外部类

  5. 不可以修饰局部变量

  6. 不可以修饰构造方法

1.2修饰成员变量的方法

访问方式: 类名.类中成员(变量、方法)

1.2.1static语句修饰后的特点

static类级别的修饰符(被修饰的成员属于类)当用到一个类的时候(new 类名(…)),会将该类的字节码文件加载到元空间,在加载的时候,会将有static修饰的成员,优先加载到静态区。类加载的过程只会执行一次,只有一份。执行完毕后该static修饰的成员会被所有以该字节码文件为模板创建的对象所共享。

/*
举例说明:

设计一个学生类,其中有name-姓名 字段,是否应该加static 呢?

效果:加了static修饰的字段:该字段被该类所有对象共享:当一个对象修改了该字段,其他对象使用该字段,都是修改之后的值
*/
/
 *	学生类
 */
public class Student {
	/用static修饰name,会被所有用Student模板创建的对象共享*/
	static String name;
	public Student(String n) {
		name = n;//将传入的n赋值给成员变量name
	}
	public static void testStatic() {
		System.out.println("static修饰方法");
	}
	
	static class Inner{
	}
}

/
 *	static测试类
 */
public class StudentTest {

	public static void main(String[] args) {
		//调用有参构造,创建对象并且直接赋值
		Student stu1 = new Student("隔壁老王");
		//打印stu1的名字
		System.out.println(stu1.name);//隔壁老王
		
		//调用有参构造,创建对象并且直接赋值
		Student stu2 = new Student("隔壁老孙");
		//打印stu2的名字
		System.out.println(stu2.name);//隔壁老孙
		//重新打印stu1的名字
		System.out.println(stu1.name);//隔壁老孙(居然不是隔壁老王)
	}
}

1.3变量的重新分类 

成员变量(也叫字段、属性) : 静态的(类变量)和非静态的(实例变量instance)

static int age; 类变量, 有static修饰的成员变量(字段);

int age; 实例变量,没有static修饰的成员变量(字段);

局部变量:方法里边(定义,形参)、代码块

二、final修饰符

4.1 final概念

关键字,修饰符,表示最终的。就是一旦修饰一个成员,该成员就不能再被修改了。

4.2 final作用:

可以修饰:

外部类:太监类,不能被继承

实例变量:必须在声明的时候赋值或者在构造方法中赋值

类变量: 必须在声明的时候赋值

实例方法:不能被子类重写

类方法:不能被子类重写

内部类:

局部变量:

不能修饰:

构造方法:


public class FinalTest {
	/** 实例变量	在堆中 */
	private final int A;
        private final int B = 1;// 声明的时候直接赋值
	
	/** 类变量	在静态区 */
	static final int C = 1;// 声明的时候直接赋值
	
	/**
	 * 构造方法,final不能修饰
	 */
	public FinalTest() {
		A = 1;//在构造方法中赋值
	}
	
	/**
	 * 实例方法,不能被重写
	 */
	public final void test() {
		
	}
	
	/**
	 * 类方法,不能被重写
	 */
	public static final void testStatic() {
		
	}
	
	/**
	 * 内部类,不能被继承
	 */
	final class Inner{
		
	}
	
	public static void main(String[] args) {
		final int a;// 在栈帧中
		a = 2;// 一旦被final修饰就不能再修改
		System.out.println(a);
		
//		a = 3;// 一旦被final修饰就不能再修改
	}
}

三、枚举 

 3.1枚举的引入:

需求: 设计一个类专门用了表示性别(性别的取值比较固定:男、女、未知)

public class Gender {//表示性别类
//	public static final String MAN = "男";//MAN是String的一个对象
	//在Gender类中使用String类型,有侵入性问题。那么,能不能用Gender自己类型的对象表示一个男? 可以
	public static final Gender MAN = new Gender();//MAN是Gender的一个对象
	
//	public static final String WOMEN = "女";//WOMEN是String的一个对象
	public static final Gender WOMEN = new Gender();//WOMEN是Gender的一个对象
	
//	public static final String UNKNOWN = "未知";//UNKNOWN是String的一个对象
	public static final Gender UNKNOWN = new Gender();//UNKNOWN是Gender的一个对象
	
	@Override
	public String toString() {
		/*
		 * 希望打印格式如下:
		 * 	是MAN打印男
		 * 	是WOMEN打印女
		 * 	是UNKNOWN打印未知
		 */
		if (this == MAN) {
			return "男";
		}else if (this == WOMEN) {
			return "女";
		}else{
			return "未知";
		}
	}
}

测试类:
/**
 *	测试性别,枚举引入
 */
public class GenderTest {
	public static void main(String[] args) {
		//调用全局常量方式,类名.常量名
		System.out.println(Gender.MAN);//男
		System.out.println(Gender.WOMEN);//女
		System.out.println(Gender.UNKNOWN);//未知
	}

}

这样就比较麻烦,有更简单的方法,枚举这就来了

3.2枚举概述:

3.2.1什么是枚举

枚举是JDK1.5引入的一种和类非常类似的新结构;

枚举的出现解决了哪些问题?

枚举类解决了一些取值比较固定的场景,简化了类中的常量字段。

3.2.2枚举的作用和使用场景

作用:简化类中的常量声明这种代码,是代码变得更加优雅

使用场景:vip、生肖、段位、QQ状态、血型、性别、星座、月份、礼拜..

3.2.3枚举的语法

① 声明语法:

public enum 枚举类名字{

字段

实例变量

实例方法

类方法

构造方法 - 枚举中的构造方法默认都是private修饰,不能够是public,protected修饰

构造方法作用:只能在当前枚举类中使用,就是给当前枚举类对象初始化实例变量的

}

语法:
public enum Gender {//表示性别类
//	MAN,//相当于一个常量public static final Gender = new Gender();
	MAN(),//MAN这里也可以这样写,这里就是在调用当前枚举类的无参构造
	WOMEN("女"),//这里就是在调用当前枚举类的String类型有参构造
	UNKNOWN,
	其他;//也可以写中文,但是不建议,建议写法:WOMEN("");
	private String name;//实例变量,属于每一个枚举对象,如:MAN,WOMEN..
	
	/**
	 * 无参构造
	 */
	Gender() {//默认有一个隐式的private修饰
		
	}
	
	/**
	 * 有参构造
	 */
	Gender(String name) {//默认有一个隐式的private修饰
		this.name = name;
	}
	
	@Override//实例方法
	public String toString() {
		if (this == MAN) {
			return "男";
		}else if (this == WOMEN) {
			return "女";
		}else{
			return "未知";
		}
	}
	
	/**
	 * 类方法
	 */
	public static void test() {
	
	}
}

② 枚举类编译完毕也同样生成字节码文件

③ 每一个自定义的枚举类型都(隐式的)继承于 Enum抽象类,因此我们的枚举对象可以调用到Enum中的方法的(看API )。但是不能显示的写出继承关系。

3.4枚举注意事项

  1. 字段之间用逗号,最后一个字段用分号结束

  2. 可以写中文字段,但是不建议

  3. 枚举类都会隐式继承了Enum类(所有枚举类的父类),不能显示写出来

  4. 构造方法必须是private的 枚举的对象只能自己创建,只是在自己类使用

题目:基于面向对象的农业机械租赁管理系统1.项目背景随着农业机械化进程的加快,越来越多的农户选择租赁农机设备来提升生产效率。为有效管理农机信息、租赁订单以及支付流程,现需开发一套农业机械租赁管理系统。该系统将基于面向对象编程思想,充分运用封装、继承、多态三大特性进行设计与实现。2. 系统需求2.1 农机管理模块2.1.1 农机基础信息(抽象类 AgriculturalMachinery)机械编号(machineId):私有属性,通过 getter 方法访问。 基础租金(baseRent):protected 修饰,单位为元 / 天。 工作状态(status):采用枚举类型,包含 IDLE(闲置)、IN_USE(使用中)、UNDER_MAINTENANCE(维护中)。抽象方法 calculateRent():用于计算租金,具体计费逻辑由子类实现。2.1.2 具体农机类型(继承 AgriculturalMachinery)拖拉机(Tractor)特有属性:马力(horsepower)、最大牵引力(maxPullForce)。租金计算方式:基础租金 + 马力 × 0.5。收割机(Harvester)特有属性:割台宽度(cuttingWidth)、粮仓容量(grainTankCapacity)。租金计算方式:基础租金 + 割台宽度 × 10。2.2 租赁订单模块2.2.1 订单类(RentalOrder)私有属性orderId:订单编号。machineryList:租赁的农机列表,类型为 List。rentalDays:租赁天数。totalCost:总费用。公有方法addMachinery(machine):将农机添加到订单中。calculateTotal():遍历 machineryList,调用每个农机的 calculateRent() 方法计算订单总租金。 generateReceipt():按照指定格式生成订单收据。2.2.2 订单示例输出【订单编号】ORD20231001【租赁农机】1. 拖拉机(编号:TR001,马力:120HP) × 3天 → 租金:600元2. 收割机(编号:HV002,割台宽度:2.5m) × 2天 → 租金:450元【总费用】1050元2.3 支付系统模块2.3.1 支付基类(Payment,抽象类)公有属性:paymentAmount,表示支付金额。抽象方法:processPayment(),返回 boolean 类型,用于判断支付是否成功。 2.3.2 具体支付方式(继承 Payment)微信支付(WeChatPayment)特有属性:openId,用户微信标识。方法实现:实现 processPayment() 方法,模拟微信支付,返回 true 表示支付成功。 支付宝支付(AlipayPayment)特有属性:accountNo,支付宝账号。方法实现:实现 processPayment() 方法,模拟支付宝支付。 银行卡支付(BankCardPayment)特有属性:cardNo,银行卡号。方法实现:实现 processPayment() 方法,模拟银行卡扣款。 2.3.3 支付流程用户从微信、支付宝、银行卡三种方式中选择支付方式。根据用户选择创建对应的支付对象,体现多态特性。调用 processPayment() 方法完成支付操作。 3. 面向对象设计要求封装:将所有属性设置为私有化,通过公有方法进行访问和操作,确保数据的安全性和完整性。继承:农机类和支付方式类采用父子类结构,子类继承父类的属性和方法,避免重复代码,提高代码的复用性。多态在计算租金时,RentalOrder 类调用不同农机子类的 calculateRent() 方法,根据具体农机类型执行相应的租金计算逻辑。 在支付过程中,统一调用 Payment 类的 processPayment() 方法,实际执行时根据具体支付子类实现不同的支付逻辑。 4. 提交要求4.1 设计文档(3 课时)类图:绘制类图展示 AgriculturalMachinery、RentalOrder、Payment 及其子类之间的关系。 核心方法的伪代码:提供如 calculateRent()、processPayment() 等核心方法的伪代码,描述其实现逻辑。 4.2 代码实现(5 课时)编写完整的 Java 代码,代码中包含合理的注释,以便清晰理解代码功能和逻辑。至少实现 2 种农机类型(拖拉机、收割机)和 3 种支付方式(微信、支付宝、银行卡)。4.3 测试与输出(2 课时)模拟一次完整的租赁流程,并在控制台输出以下内容:农机信息。订单明细。支付结果 Java输出。 使用图形界面,异常处理,抛出异常
06-02
### 农业机械租赁管理系统的设计与实现 以下是一个基于面向对象的农业机械租赁管理系统的详细设计方案,包括农机类设计、订单管理模块、支付系统以及异常处理和图形界面输出。 --- #### 1. 农机类设计 农机类设计需要考虑多态性,通过继承实现拖拉机和收割机的具体功能。以下是农机类的抽象基类及子类设计: ```java // 抽象农机类 public abstract class AgriculturalMachine { private String name; private double pricePerHour; public AgriculturalMachine(String name, double pricePerHour) { this.name = name; this.pricePerHour = pricePerHour; } public String getName() { return name; } public double getPricePerHour() { return pricePerHour; } // 定义抽象方法,具体行为由子类实现 public abstract void operate(); } // 拖拉机类 public class Tractor extends AgriculturalMachine { public Tractor(String name, double pricePerHour) { super(name, pricePerHour); } @Override public void operate() { System.out.println("Tractor is plowing the field."); } } // 收割机类 public class Harvester extends AgriculturalMachine { public Harvester(String name, double pricePerHour) { super(name, pricePerHour); } @Override public void operate() { System.out.println("Harvester is harvesting crops."); } } ``` --- #### 2. 订单管理模块 订单管理模块负责记录用户租赁的农机信息、租赁时间及费用计算。以下是订单类的实现: ```java import java.util.Date; // 订单类 public class RentalOrder { private AgriculturalMachine machine; private Date rentalDate; private int hoursRented; public RentalOrder(AgriculturalMachine machine, Date rentalDate, int hoursRented) { this.machine = machine; this.rentalDate = rentalDate; this.hoursRented = hoursRented; } public double calculateTotalPrice() { return machine.getPricePerHour() * hoursRented; } public void displayOrderDetails() { System.out.println("Machine: " + machine.getName()); System.out.println("Rental Date: " + rentalDate); System.out.println("Hours Rented: " + hoursRented); System.out.println("Total Price: $" + calculateTotalPrice()); } } ``` --- #### 3. 支付系统设计 支付系统支持微信、支付宝和银行卡支付方式。以下是支付接口及其具体实现: ```java // 支付接口 public interface PaymentMethod { boolean pay(double amount); } // 微信支付实现 public class WeChatPay implements PaymentMethod { @Override public boolean pay(double amount) { System.out.println("Paying via WeChat: $" + amount); return true; // 假设支付成功 } } // 支付宝支付实现 public class Alipay implements PaymentMethod { @Override public boolean pay(double amount) { System.out.println("Paying via Alipay: $" + amount); return true; // 假设支付成功 } } // 银行卡支付实现 public class BankCardPay implements PaymentMethod { @Override public boolean pay(double amount) { System.out.println("Paying via Bank Card: $" + amount); return true; // 假设支付成功 } } ``` --- #### 4. 异常处理 在系统中加入异常处理机制,确保程序在运行时能够捕获并处理潜在错误。例如,当用户输入无效数据或支付失败时,系统应提示相应错误信息。 ```java // 自定义异常类 public class InvalidInputException extends Exception { public InvalidInputException(String message) { super(message); } } // 示例:检查租赁小时数是否有效 public class InputValidator { public static void validateHours(int hours) throws InvalidInputException { if (hours <= 0) { throw new InvalidInputException("Hours must be greater than zero."); } } } ``` --- #### 5. 图形化界面输出 使用Java Swing库创建简单的图形用户界面(GUI),供用户选择农机、输入租赁时间和完成支付。 ```java import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class AgriculturalRentalSystemGUI { public static void main(String[] args) { JFrame frame = new JFrame("Agricultural Machine Rental System"); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); JLabel label = new JLabel("Select Machine:"); String[] machines = {"Tractor", "Harvester"}; JComboBox<String> machineComboBox = new JComboBox<>(machines); JLabel hoursLabel = new JLabel("Enter Hours:"); JTextField hoursField = new JTextField(10); JButton rentButton = new JButton("Rent"); rentButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { int hours = Integer.parseInt(hoursField.getText()); InputValidator.validateHours(hours); // 检查输入有效性 String selectedMachine = (String) machineComboBox.getSelectedItem(); JOptionPane.showMessageDialog(frame, "You rented a " + selectedMachine + " for " + hours + " hours."); } catch (InvalidInputException ex) { JOptionPane.showMessageDialog(frame, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(frame, "Please enter a valid number of hours.", "Error", JOptionPane.ERROR_MESSAGE); } } }); panel.add(label); panel.add(machineComboBox); panel.add(hoursLabel); panel.add(hoursField); panel.add(rentButton); frame.add(panel); frame.setVisible(true); } } ``` --- ### 总结 上述代码展示了如何用Java实现一个基于面向对象的农业机械租赁管理系统,涵盖农机类设计、订单管理模块、支付系统、异常处理和图形化界面输出[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值