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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值