访问私有内部类中重写的方法与私有构造

问题描述:

请找到下面的代码片段: 阶级统治访问私有内部类中重写的方法与私有构造

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 
     } 
    } 
} 

类RelOptRule

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); 
} 

我的问题是:哪有我访问嵌套类Rules.JarvisFilterRule的onMatch()方法?

+0

'onMatch'方法是一个_instance_方法,所以你不能“访问内部_class_”的onMatch()方法。您可以在由常量“FILTER”引用的新JarvisFilterRule实例上调用该方法。只需调用'Rules.FILTER.onMatch(...)'。除此之外,你的代码不能编译,你的问题很不明确。 – Seelenvirtuose

+0

直到Rules.FILTER,我没有得到任何错误。但是当我调用Rules.FILTER.onMatch(..)时,我得到一个编译错误“类型Rules.JarvisFilterRule不可见”。 –

private关键字的目的是为了防止访问需要由声明它的类专门使用的类成员。

在你的情况下,Rules类定义JarvisFilterRule是有意向,其实施应仅已知Rulesprivate内部类。

如果您希望访问在另一个类中的方法JarvisFilterRule::onMatch(),你将需要public更换private改性剂JarvisFilterRule或内部类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 
     } 
    } 
} 

希望这有助于!

Rules.FILTER.onMatch(...)

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

+0

感谢您指出它。纠正。 –