java中的子保护方法。 (想不出一个更好的方式来表达这个)

时间:2013-07-06 09:08:15

标签: java inheritance methods subclass visibility

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

例如,类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
    }
}

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

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

3 个答案:

答案 0 :(得分:1)

您无法使用可见性级别。这些级别严格嵌套在Java中,并且可以访问子类而不是包的级别会破坏它。

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

答案 1 :(得分:0)

使用访问修饰符实际上无法做到这一点。因为在protected修饰符(同一包中的子类+类)和默认修饰符(同一包中的类)之间只有两个选项。

通过将所有非子类删除到具有protected / default访问说明符的其他包,可以实现此目的。

答案 2 :(得分:0)

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