有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用私有构造函数访问私有内部类的重写方法

请查找以下代码段: 等级规则

public class Rules {

    public static final JarvisFilterRule FILTER = new JarvisFilterRule();

    private static class JarvisFilterRule extends RelOptRule {
        private JarvisFilterRule() {
            super(operand(Filter.class, operand(Query.class, none())));
        }

        public void onMatch(RelOptRuleCall call) {
        // do something
        }
    }
}

类重新编译

public abstract class RelOptRule {

  /**
   * Description of rule, must be unique within planner. Default is the name
   * of the class sans package name, but derived classes are encouraged to
   * override.
   */
    protected final String description;
    public abstract void onMatch(RelOptRuleCall call);
}

我的问题是:如何访问嵌套类规则的onMatch()方法。JarvisFilterRule


共 (2) 个答案

  1. # 1 楼答案

    Rules.FILTER.onMatch(...)

    JarvisFilterRule不是内部类。Java中的内部类是非静态的嵌套类

  2. # 2 楼答案

    private关键字的目的是防止访问需要由声明它的类独占使用的类成员

    在您的例子中,Rules类将JarvisFilterRule定义为一个private内部类,其实现应该只为Rules类所知

    如果希望访问另一个类中的JarvisFilterRule::onMatch()方法,则需要将JarvisFilterRuleprivate修饰符替换为public,或者将内部类JarvisFilterRule移动到其自己的单独文件中,并使其成为public类。像这样:

    JarvisFilterRule .java

    public class JarvisFilterRule extends RelOptRule {
            public JarvisFilterRule() {
                super(operand(Filter.class, operand(Query.class, none())));
            }
    
            public void onMatch(RelOptRuleCall call) {
            // do something
            }
        }
    

    public class Rules {
    
        public static final JarvisFilterRule FILTER = new JarvisFilterRule();
    
        public static class JarvisFilterRule extends RelOptRule {
            private JarvisFilterRule() {
                super(operand(Filter.class, operand(Query.class, none())));
            }
    
            public void onMatch(RelOptRuleCall call) {
            // do something
            }
        }
    }
    

    希望这有帮助