为了账号安全,请及时绑定邮箱和手机立即绑定

具有定义的匿名类实例化 - 覆盖受保护的方法

具有定义的匿名类实例化 - 覆盖受保护的方法

翻翻过去那场雪 2021-07-17 19:16:34
让我们假设我有课:class A {    protected int x; // no public getter, setter}现在我想扩展 A 类,以覆盖 'x' 变量。答案是:public class SomeClass {    someMethod() {        A extendedClass = new MyExtension(5);    }    class MyExtension extends A {        public MyExtension(int x) {            super.x = x;        }    }}我的问题是:有没有可能在不单独定义嵌套类的情况下做到这一点?我的意思是这样的    someMethod() {        A extendedClass = new A() {            // here do something like super.x = 5;        }    }我尝试从匿名类调用新定义的方法,但它不会让我实例化 A 类。我也不想使用反射。我很简单,不想定义嵌套类只是为了覆盖一个属性。问题的根源是Spring-integration ImapMailReceiver,我想覆盖任务调度程序。像下面这样:    final ImapMailReceiver imapMailReceiver = new ImapMailReceiver() {           super.setTaskScheduler(MYTASKSCHEDULERHERE);    }
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

您new A() { ... }仍然只是定义一个新类。因此,你不能简单地把大括号,只有字段,方法和嵌套类型声明之间的任何语句可以去那里,但是构造器是不是允许。您可以改为添加实例初始化程序:


A extendedClass = new A() {

  {

    x = 5;

  }

}


查看完整回答
反对 回复 2021-07-29
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

为什么要使用嵌套或匿名内部类?我们可以覆盖并访问覆盖的变量,如下所示。


public class SomeClass extends A{

    int val;

    void someMethod(int val) {

        super.x = val;

    }


    public static void main(String[] args) {

        SomeClass sc = new SomeClass();

        System.out.println(sc.x);  // output=10

        sc.someMethod(20);

        System.out.println(sc.x);  // output=20

    }


}

class A {

    protected int x = 10; // no public getter, setter

}


查看完整回答
反对 回复 2021-07-29
  • 2 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信