Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 - Fatal编程技术网

Java 为什么私有内部接口的方法必须是公共的?

Java 为什么私有内部接口的方法必须是公共的?,java,Java,我有一个实现私有内部接口的私有内部类。我通常省略私有内部类中的私有修饰符,以使代码更干净。不幸的是,在这种情况下,我得到了“无法降低可见性错误”,即使我实际上并没有降低可见性 public class Foo { private interface IBar{ void foo(); } private static class Bar implements IBar{ @Override public void foo(

我有一个实现私有内部接口的私有内部类。我通常省略私有内部类中的私有修饰符,以使代码更干净。不幸的是,在这种情况下,我得到了“无法降低可见性错误”,即使我实际上并没有降低可见性

public class Foo {
    private interface IBar{
        void foo();
    }

    private static class Bar implements IBar{
        @Override
        public void foo() { // Must be public :(
        }
    }
}

我认为没有办法解决这个问题?

接口的所有方法都是
public
abstract
。这是规则

只有将它们
公开
才有意义,因为它们将通过实现可能来自不同包的类来实现


即使它是一个内部的
接口
,它仍然是
接口
,因此规则不会改变。

接口的所有方法都是
公共的
抽象的
。这是规则

只有将它们
公开
才有意义,因为它们将通过实现可能来自不同包的类来实现


即使它是一个内部
接口
,它仍然是
接口
,因此规则不会改变。

接口上的所有方法都必须声明为
公共
。如果未在
foo
方法上指定访问修饰符,则默认情况下会为其分配
包保护的访问。由于受包保护的
public
更难访问,因此代码降低了
foo
方法的可访问性。

接口上的所有方法都必须声明为
public
。如果未在
foo
方法上指定访问修饰符,则默认情况下会为其分配
包保护的访问。由于
包保护
公共
更难访问,因此该代码降低了
foo
方法的可访问性。

接口
的所有方法都是
公共
抽象
。如果您没有定义任何修改器,那么默认情况下它是
public
abstract


重写的一般规则是不能降低方法的可见性。在类中,如果您没有定义任何修饰符,那么默认情况下它将是默认的,并且默认情况下不太可见,而不是公共的。所以这里它必须是公共的

一个
接口的所有方法都是
公共的
抽象的
。如果您没有定义任何修改器,那么默认情况下它是
public
abstract



重写的一般规则是不能降低方法的可见性。在类中,如果您没有定义任何修饰符,那么默认情况下它将是默认的,并且默认情况下不太可见,而不是公共的。所以这里它必须是公共的,因为一个接口的所有方法都必须是公共的。否则,它对私有内部接口是没有意义的。对于私有内部类,您最好从公共内部基类继承。我不认为使用私有接口有什么意义。不,没有。一个接口就是你是“公共”合同。否则是没有意义的,也没有任何理由这样做。@t在我的情况下,这是因为我需要创建一个私有内部类的代理和proxy.newProxyInstance(…),它需要一个接口类。因为接口的所有方法都必须是
公共的
。否则,它对私有内部接口是没有意义的。对于私有内部类,您最好从公共内部基类继承。我不认为使用私有接口有什么意义。不,没有。一个接口就是你是“公共”合同。否则没有任何意义,也没有任何理由做其他事情。@t在我的情况下,这是因为我需要创建一个私有内部类的代理和proxy.newProxyInstance(…),它需要一个接口类。+1技术JVM不允许访问其他类的私有成员。事实上,您可以这样做完全是由于编译器生成的代码。对于私有接口,接口方法私有是完全有意义的。@fhucho但您永远无法实现接口…
private
方法不能被重写,这没有意义…@MadProgrammer我可以用私有方法创建一个私有静态类Foo,并在另一个私有静态类栏中重写此方法。@fhuch尝试将
@overrided
标记添加到
栏中的方法,它将给你一个错误。尝试从
Bar#privateMethod
中调用
super.privateMethod()
,它会给您一个错误。您不能“重写”私有方法。您可以使用相同的名称,但这与重写…+1不同,因为JVM不允许访问其他类的私有成员。事实上,您可以这样做完全是由于编译器生成的代码。对于私有接口,接口方法私有是完全有意义的。@fhucho但您永远无法实现接口…
private
方法不能被重写,这没有意义…@MadProgrammer我可以用私有方法创建一个私有静态类Foo,并在另一个私有静态类栏中重写此方法。@fhuch尝试将
@overrided
标记添加到
栏中的方法,它将给你一个错误。尝试从
Bar#privateMethod
中调用
super.privateMethod()
,它会给您一个错误。您不能“重写”私有方法。您可以使用相同的名称,但这与重写不同…好的,但是私有类Foo的私有方法实际上具有与具有公共修饰符完全相同的可见性。好的,但是私有类Foo的私有方法实际上具有与具有公共修饰符完全相同的可见性。