Java技术问题:如何在主类对象上调用父类的公共方法?
解决方案:通过继承+封装实现方法复用与统一调用
首先先修正你示例代码里的小问题:A类中直接给device赋值的写法不符合Java语法规范,应该把赋值逻辑放在构造方法、初始化块或者静态代码块中,比如:
public class A extends C { public UiDevice device; // 在构造方法中初始化device public A() { device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); } public void test(){ methodFromC(); // 继承后可直接调用父类方法 } }
接下来针对你的核心需求,分步骤实现:
1. 把公共方法集中到父类C中
将A、B类共用的方法全部迁移到C类,同时可以把公共依赖(比如UiDevice)也提到父类,避免子类重复定义和初始化:
public class C { // 用protected修饰,子类可直接访问,外部类不可直接访问,兼顾封装性 protected UiDevice device; // 父类构造方法统一初始化device,子类无需重复编写 public C() { this.device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); } // 所有子类共用的方法1 public void methodFromC() { // 示例逻辑:操作device device.pressHome(); } // 所有子类共用的方法2 public void commonOperation() { // 通用业务逻辑 System.out.println("执行公共操作"); } }
之后A、B类只需继承C,就能直接使用这些公共方法,同时可以保留自己的独有逻辑:
public class A extends C { // A类独有的方法 public void testA() { methodFromC(); // 调用父类公共方法 commonOperation(); // 调用父类另一个公共方法 // A类专属逻辑 device.pressBack(); } } public class B extends C { // B类独有的方法 public void testB() { methodFromC(); // 同样可调用父类公共方法 // B类专属逻辑 device.click(); } }
2. 在主类中调用不同子类的方法
如果你的"主类"是指入口类,需要调用A、B的方法,直接实例化子类对象后调用即可:
public class MainEntry { public static void main(String[] args) { // 调用A类的方法 A aInstance = new A(); aInstance.testA(); aInstance.methodFromC(); // 也可直接调用继承来的父类方法 // 调用B类的方法 B bInstance = new B(); bInstance.testB(); bInstance.commonOperation(); } }
如果需要用父类引用统一管理不同子类(多态场景),可以这样写:
public class MainEntry { public static void main(String[] args) { // 父类引用指向子类对象 C cInstance1 = new A(); cInstance1.methodFromC(); // 调用父类方法(若子类重写则调用子类实现) // 要调用A类独有方法,需强制类型转换 ((A)cInstance1).testA(); C cInstance2 = new B(); cInstance2.commonOperation(); ((B)cInstance2).testB(); } }
额外优化建议
- 如果
C仅作为公共方法容器,不需要被直接实例化,可以将其设为抽象类:public abstract class C,避免误创建C的实例。 - 若部分公共方法需要子类自定义实现,可在
C中定义抽象方法,比如public abstract void customMethod();,强制子类实现,保证代码规范统一。 - 对于
UiDevice这种单例对象,可在C中用静态代码块初始化,让所有子类共享同一个实例:public class C { protected static UiDevice device; static { device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); } }
内容的提问来源于stack exchange,提问作者lgtkbz
相关产品推荐
相关产品推荐

