Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的次保护方法。(想不出更好的表达方式了)_Java_Inheritance_Methods_Subclass_Visibility - Fatal编程技术网

java中的次保护方法。(想不出更好的表达方式了)

java中的次保护方法。(想不出更好的表达方式了),java,inheritance,methods,subclass,visibility,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{

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

例如,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
    }
}
请注意,这些类中的任何一个都可以在任何包中,因此简单的“受保护”都不起作用


如果关键字或类似的东西不可能做到这一点,我愿意听取关于如何实现类似行为的建议。

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


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

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


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

public
是允许从不同包中的非扩展类调用方法的唯一关键字。因此,如果您仍然想从pulic view中隐藏该方法并将类放在任何位置,则必须通过反射调用该方法(这是脏的)。

您可以将该类保存在仅包含该类的单独包中。并使该方法受保护。是否可以使用Thread.currentThread().getStackTrace()[1]或者获取方法调用方并确保其来源有效?@user1825860如果您想要运行时解决方案而不是编译时解决方案,那么是的,您可以尝试一些事情。好的,伙计们,结果证明我的示例被误解了,整个问题可以用protected解决,因为我不知道它的特点。嗯。。。那没用,这是API的一部分。有解决办法吗?