Java入参细节

博客围绕Java入参细节展开,通过代码实验探讨函数传入参数引用指向其他对象时,原引用是否随之改变。结果表明,修改传参指向新对象不影响方法外引用;修改引用指向对象的成员变量,方法外引用指向的对象也会改变;基本数据类型在方法内修改入参值,不影响方法外原值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java入参细节

今天遇到一个问题,关于函数传入参数引用指向其他对象时,原来的引用会随之指向新的对象吗?现在用代码实验一下

  • 改变传入参数引用指向的对象
public class Test{
	static class Inner{
			int count =0;
		}
	public static void main(String[] args) {
		Inner in = new Inner();
		in.count = 1;
		test(in);	
		System.out.println(in.count);//结果还是1
	}
	
	private static void test(Inner in) {
		in = new Inner();
		in.count = 10;
	}
}
  • 改变引用指向的对象的成员变量的值
public class Test{
	static class Inner{
			int count =0;
		}
	public static void main(String[] args) {
		Inner in = new Inner();
		in.count = 1;
		test(in);	
		System.out.println(in.count);//结果变为10
	}
	
	private static void test(Inner in) {
		//in = new Inner();
		in.count = 10;
	}
}
  • 查看方法内外引用指向的对象的地址
public class Test{
	static class Inner{
			int count =0;
		}
	public static void main(String[] args) {
		Inner in = new Inner();
		in.count = 1;
		System.out.println(in);
		test(in);	
		System.out.println(in.count);//结果还是1
	}
	
	private static void test(Inner in) {
		System.out.println(in);
		in = new Inner();
		System.out.println(in);
		in.count = 10;
	}
}

结果
ceshi.StringTest$Inner@15db9742
ceshi.StringTest$Inner@6d06d69c
ceshi.StringTest$Inner@15db9742
1
  • 基本数据类型
public class Test{
	public static void main(String[] args) {
		int i = 0test(i);
		System.out.println(i);//仍然是0
	}
	
	private static void test(int i) {
		i++;
	}
}

总结:
通过实验可以看出,修改传参指向新的对象,并不会影响方法外的引用,这里可以理解为这个方法参数是一个新的引用,而如果直接修改引用指向对象的成员变量,方法外引用指向的对象也随之被修改,这里可以理解为是对引用指向的对象直接进行修改,修改的对象是同一个。而对于基本数据类型,在方法内修改入参的值,并不会修改到方法外原来的值。

<think>好的,用户想用Java写一个库代码,是BOM头和BOM行。首先,我需要确认用户的需求是什么。BOM通常指物料清单,可能涉及到数据库操作,比如存储到数据库。所以,我需要先明确BOM头和BOM行的结构。 接下来,我得考虑如何设计这两个类。BOM头可能包含单据编号、创建时间、创建人等信息,而BOM行可能有行项目号、物料编号、数量、单位等。用户可能需要将这些信息持久化到数据库中,所以可能需要数据库事务管理。 然后,用户可能需要一个服务类来处理库逻辑,比如验证数据的有效性,比如检查必填字段是否为空,或者数量是否为正数。然后,使用DAO层将数据插数据库。这可能需要用到事务,确保头和行同时成功或失败。 另外,用户可能没有提到具体的数据库框架,比如是否使用JPA、MyBatis或者JDBC。为了通用性,我可能需要用接口来解耦,这样用户可以根据自己的情况实现具体的数据库操作。 还需要考虑异常处理,比如数据验证失败时抛出异常,或者数据库操作出错时的回滚。同时,要确保事务的一致性,比如在插BOM行时如果失败,整个事务要回滚,避免脏数据。 另外,用户可能需要示例代码来展示整个流程,所以我会创建BomHeader和BomItem类,然后一个BomService类处理业务逻辑,以及DAO接口。这样用户可以考结构,并根据实际技术栈实现具体细节。 最后,要提醒用户注意事项,比如事务管理、数据验证的具体规则,以及异常处理的重要性。确保代码的健壮性和可维护性。</think>以下是用Java实现BOM库的示例代码框架,包含关键步骤说明: ```java // 1. 定义BOM头实体类 public class BomHeader { private String bomCode; // BOM单据编号 private Date createTime; // 创建时间 private String creator; // 创建人 private String description; // 描述 // 其他字段... } // 2. 定义BOM行实体类 public class BomItem { private String lineNumber; // 行项目号 private String materialCode; // 物料编码 private BigDecimal quantity; // 数量 private String unit; // 单位 // 其他字段... } // 3. 库服务类 public class BomService { /** * BOM库主方法 * @param header BOM头信息 * @param items BOM行列表 * @throws ValidationException 数据校验异常 */ @Transactional(rollbackFor = Exception.class) // 声明式事务管理 public void saveBom(BomHeader header, List<BomItem> items) { // 4. 数据校验 validateBom(header, items); // 5. 持久化操作 bomHeaderDao.insert(header); for (BomItem item : items) { item.setBomCode(header.getBomCode()); // 设置关联编码 bomItemDao.insert(item); } } // 数据校验方法 private void validateBom(BomHeader header, List<BomItem> items) { if (header == null || items == null) { throw new ValidationException("BOM头和行不能为空"); } if (StringUtils.isEmpty(header.getBomCode())) { throw new ValidationException("BOM编号不能为空"); } if (items.isEmpty()) { throw new ValidationException("至少需要包含一个BOM行项目"); } for (BomItem item : items) { if (item.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { throw new ValidationException("数量必须大于0"); } } } } // 6. DAO接口定义(示例) public interface BomHeaderDao { int insert(BomHeader header); } public interface BomItemDao { int insert(BomItem item); } ``` 关键实现要点说明: 1. **事务管理**: - 使用`@Transactional`注解确保原子性操作 - 头信息和行信息要同时成功或同时失败 - 推荐使用Spring的事务管理 2. **数据校验**: - 空值检查 - BOM编号唯一性校验(需在DAO层实现) - 数量有效性校验 - 关联关系校验 3. **性能优化建议**: ```java // 批量插优化(MyBatis示例) public interface BomItemDao { void batchInsert(List<BomItem> items); } // 在Service中改为: bomItemDao.batchInsert(items); ``` 4. **扩展建议**: - 增加版本号字段处理并发 - 添加审核状态字段 - 增加历史记录跟踪 - 实现物料编码有效性校验 注意事项: 1. 根据实际数据库表结构调整实体类字段 2. 需要实现具体的DAO层数据库操作 3. 建议结合具体框架(如MyBatis、JPA)实现持久层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值