Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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_Protected - Fatal编程技术网

Java 仅从派生类访问基类方法

Java 仅从派生类访问基类方法,java,inheritance,protected,Java,Inheritance,Protected,例如,我有两门课: class Foo { protected void say() {...}; } class Bar extends Foo {.....} 我是否可以允许仅从Bar和其他派生类调用“say”方法,而不从Foo包中的其他类调用该方法。否,受保护的意思是,受保护的成员可以在同一个包和任何包中的所有子类中访问。如果您想在包级别限制访问,请将该类移动到一个单独的包中。在java中没有一种方法可以做到这一点。在java中没有这样的访问器可以满足您的需要,而且恐怕不可能实现该

例如,我有两门课:

class Foo
{
  protected void say() {...};
}

class Bar extends Foo {.....}

我是否可以允许仅从Bar和其他派生类调用“say”方法,而不从Foo包中的其他类调用该方法。

否,受保护的意思是,受保护的成员可以在同一个包和任何包中的所有子类中访问。如果您想在包级别限制访问,请将该类移动到一个单独的包中。

在java中没有一种方法可以做到这一点。

在java中没有这样的访问器可以满足您的需要,而且恐怕不可能实现该限制(也就是说,以一种简单的方式).

如果符合您的架构,那么将Foo
抽象化可能是一个解决方案。@Merguez我不认为这可能是一个解决方案…@m0skit0我想我有点误解了。但是这会使不扩展Foo的类无法访问
say()
方法(因为您无法生成Foo的实例)@Merguez您确实是对的,如果不需要Foo实例,这将是一个有效的解决方案。遗憾的是,Foo实例可能需要提供默认实现。此外,如果Bar与Foo位于同一个包中,那么其他类也可以访问它的“say”方法。所以这个抽象的决定不是100%正确的。不过,这是一个有趣的想法。谢谢你的回答。我曾考虑将一个对象作为参数传递,并在“say”中使用instanceof,但它太脏,对其他人来说也不明显。因此,您要么将类移动到新包中,要么与使用当前包的人员合作。阿米丽特?@Smilez:不客气:)