在Java中扩展私有类

在Java中扩展私有类,java,language-lawyer,Java,Language Lawyer,我发现以下程序令人费解: package package1; public class Main { private static class A { } public static class B extends A { } } // ---------------- package package2; public class Test { public static void main(String[] args) { Main.B b =

我发现以下程序令人费解:

package package1;

public class Main {
    private static class A { }

    public static class B extends A { }
}

// ----------------
package package2;


public class Test {
    public static void main(String[] args) {
        Main.B b = new Main.B();
    }
}
为什么Java允许公共类
B
扩展私有类
A
?在其他语言中,例如C#类只能在私有类本身是私有的情况下扩展私有类


当扩展私有类可能有用时,您能提供任何场景吗?

这将允许A成为一个实现细节(不对外公开),但在内部可重用(作为B的基础)。对于B的用户来说,他们关心的是B可以履行其API公开的所有合同。事实上,B内部使用A来履行这些合同不应该打扰任何外部用户,对吗


想象一下,A可以有更多的子类C、D、E、F等。A的代码可以被它们重用。

当你拥有的功能与你的类没有真正的关系,但不能独立存在时,例如onclick事件等等。。。您创建了一个内部类,因为该逻辑仅适用于该类。除此之外,您还可以扩展并执行程序逻辑所需的任何操作


这也是一个非常好的OCP问题。

不同的问题,但回答正确:如果您想要一个真正的用例,请检查Oracle的JDK中为什么存在
java.lang.AbstractStringBuilder
。它是一个(包)私有类,用于处理
StringBuffer
StringBuilder
的所有公共逻辑。所有方法都是在该类中编写的,两个子类都只需在这些类上调用
super
(出于文档原因,在这两种情况下,以及在
StringBuffer
的情况下,
synchronized
)。这允许只编写一次逻辑,同时向用户提供两个不同的API。如果
A
is实现细节,则应通过组合和/或委托隐藏is。在您提供的示例中,最好定义该接口的公共接口和私有实现,客户机类只使用接口,并不真正了解实现。当然,它可以!这并不意味着它应该。Java允许它作为扩展,因此在正确使用时它是一个很好的特性。不迟于4小时前,我编写了一个公共隐藏父对象,只是为了避免一次又一次地重写我的所有方法。结果允许使用非常流畅和漂亮的API。