Java中不通过继承如何导入自定义类并使用其成员字段
Java非继承场景下跨自定义类访问字段实现方案
可以通过包管理+import导入的方式实现需求,完全不需要使用继承。
前置知识:Java包(package)基本逻辑
- 包是Java内置的类组织机制,相当于文件系统的文件夹,用于避免类名冲突、控制访问权限
- IntelliJ IDEA中直接在
src目录右键选择「New → Package」,输入自定义包名(比如com.yourproject.business)即可自动创建包结构,新建类时会自动在类顶部生成包声明
具体实现方案
你不需要通过继承获取Person类的字段,用**组合(持有Person类实例)**的方式即可实现,同时能完美控制getID()方法的访问权限,分两种场景处理:
场景1:Person和Commands在同一个包下
不需要额外导入类,直接在Commands类中声明Person类型的变量即可:
// Person类代码示例 package com.yourproject.business; public class Person { // 开放给外部访问的字段 private String name; private Integer age; // 不希望外部访问的敏感字段 private String id; // 开放需要的getter方法 public String getName() { return name; } public Integer getAge() { return age; } // getID设为private,仅Person类内部可访问 private String getID() { return id; } }
// Commands类代码示例 package com.yourproject.business; public class Commands { // 持有Person类实例 private Person person; // 构造方法传入Person实例 public Commands(Person person) { this.person = person; } public void showPersonInfo() { // 正常调用开放的字段getter System.out.println("姓名:" + person.getName() + ",年龄:" + person.getAge()); // 此处调用person.getID()会直接编译报错,符合权限要求 } }
场景2:Person和Commands在不同包下
只需要在Commands类顶部导入Person类即可,IntelliJ IDEA会在你输入Person类名时自动提示导入,无需手动写导入语句:
假设Person在com.yourproject.entity包,Commands在com.yourproject.controller包,Commands类代码如下:
package com.yourproject.controller; // IDEA自动生成的导入语句 import com.yourproject.entity.Person; public class Commands { // 后续使用逻辑和同包场景完全一致 private Person person; public Commands(Person person) { this.person = person; } }
这种组合模式是比继承更灵活的类复用方案,Commands类本身不会继承Person的任何方法,所以完全不用担心用户会通过Commands实例调用到
getID()方法,只有你主动调用持有的person实例的方法时才会触发权限校验。
权限控制补充说明
- 如果只希望同包下的类能访问
getID(),可以去掉方法的private修饰符,使用默认的包访问权限,不同包的Commands类将无法调用该方法 - 如果需要开放给指定类访问,可以用protected修饰符+继承的方式,但你的场景完全不需要用到该方案
内容的提问来源于stack exchange,提问作者Koleff
相关产品推荐
相关产品推荐

