You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:32:38