2

我怎么能在给定的类中创建一个只能由它内部调用的方法,以及它的子类

例如,类 Foo:

public class Foo{
    public Foo(){

    }
    ???? void bar(){

    }
}

和 Baz 类,扩展 Foo:

public class Baz extends Foo{
    public Baz(){
        this.bar(); //valid
    }
}

还有其他一些随机类 Qux:

public class Qux{
private Baz baz = new Baz();
    public Qux(){
        baz.bar(); //invalid
    }
}

请注意,这些类中的任何一个都可以在任何包中,因此简单的“受保护”将不起作用。

如果使用关键字或类似内容无法做到这一点,我愿意接受有关如何实现类似行为的建议。

4

3 回答 3

1

没有可以使用的可见性级别。这些级别严格嵌套在 Java 中,一个可以访问子类但不能访问包的级别会破坏它。

在 Java 1.0 中,有一个访问级别“私有保护”可以做到这一点,后来的版本中删除了它,因为它使语言复杂并且不是很有用:一个子类可能是由你不信任的人创建的,而同一包中的代码由您控制。因此,保护​​自己免受子类的侵害更为重要。

于 2013-07-06T09:16:23.843 回答
0

使用访问修饰符实际上不可能做到这一点。因为在受保护的修饰符(同一个包中的子类+类)和默认修饰符(同一个包中的类)之间只有两种选择。

您可以通过将所有非子类删除到具有受保护/默认访问说明符的其他包来实现此目的的唯一方法。

于 2013-07-06T09:10:57.017 回答
0

public是唯一允许从不同包中的非扩展类调用方法的关键字。因此,如果您仍然想从公共视图中隐藏该方法并将您的类放在任何地方,您将不得不通过反射调用该方法(这很脏)。

于 2013-07-08T15:47:04.040 回答