【问题标题】:Private extend in JavaJava中的私有扩展
【发布时间】:2026-02-21 19:20:05
【问题描述】:

在 C++ 中,我们可以私有地将基类扩展(派生)到子类:

class Base
{
// ....
};

class Child : private Base
{
// ....
};

Java对应的语法是什么? 如果 Java 没有,Java 程序员怎么办?

【问题讨论】:

  • 我们不碰私处。 ;-)
  • @SanjayT.Sharma:如果您的孩子可以接触到您班级的私人成员,我会非常担心;)
  • 一般来说,我们尽量不违反 OOP 和封装的基础知识。如果您希望类的某些部分是可扩展的,请将它们保护起来。私有字段是一个实现细节。
  • @Voo:嗯,用 C++ 的朋友可以访问我们的私密部分 :)

标签: java c++ oop


【解决方案1】:

Java 的继承语法:

class Base {}
class Child extends Base
{
  // ...
}

Java 中没有私有继承。 Java只有公共继承。也就是说,你们都继承了实现和接口。

使用私有继承,您只能继承实现。据我所知,它基本上是一种更静态的构图形式。

在大多数情况下,您可以使用composition 来做同样的事情。

public class Child{
   private Base base;

   public Child(...){
       base = new Base(...);
   }
}

【讨论】:

  • 当继承是一个实现细节时,它应该被视为不仅仅是组合。考虑一个具有给定用户接口的类,在特定实现中出于某种原因需要扩展不同的接口(这不是其合同的一部分)。在 C++ 中,您可以私下实现该接口,而您的用户无法使用该事实(即,您的普通用户不能调用合同中的方法(公共接口)以外的方法。不应使用继承永远作曲。
  • 我猜在 java 中你会使用一个内部(或匿名)类来实现 private 接口,因为内部类型将隐式地能够访问你的类型。跨度>
【解决方案2】:

在一定程度上,你可以使用私有内部类来达到类似的效果:

public class Base {

    private int privateMember = 10;

    private class Child extends Base {
        public Child() {
            System.out.println("I can see your privates: " + privateMember);
        }
    }

    public static void main(String[] args) throws Exception {
        Base t = new Base();
        Child c = t.new Child();
    }

}

运行上述代码时,控制台会打印以下消息:

I can see your privates: 10

【讨论】:

    【解决方案3】:

    Java 没有任何等价物。

    【讨论】:

      【解决方案4】:

      在C++中,私有继承实际上意味着:是按照来实现的

      即当您有 2 个没有 is-a 关系但需要访问受保护成员或必须重新定义其虚函数的类时,这是一种实现技术。

      因此,根据这个定义,您可以在 Java 中通过简单地扩展类或使用组合来做到这一点。

      private 的语法不可用,但你可以得到相同的结果

      【讨论】: