Java:如何创建一个可以在包中进行子类化的公共类,同时防止外人继承?

bhh*_*988 1 java inheritance subclass access-modifiers

假设我正在写一个包.我有以下继承层次结构,都在我的包中:

public class Container {
    public void size() {
        System.out.println(10);
    }
}

public final class Bucket extends Container {}

public final class Bag extends Container {}

public class Item {
    Container container; // is aware of what container it's in. Will be initialized on construction.
    public Container getContainer() {
        return container;
    } 
}
Run Code Online (Sandbox Code Playgroud)

我想阻止其他人进行子类化Container.但我不能让它final因为BucketBag是子类.我必须做到这一点public,否则外人不能打电话getContainer().有没有办法在Java中这样做?否则,人们在这种情况下做了什么?

And*_*eas 5

要防止类被其他包中的类子类化,请使所有构造函数包为private.

如果该类没有任何构造函数,则它具有隐式默认构造函数,它是公共的,因此您需要显式创建一个package-private no-arg构造函数.

package foo;
public class Container {
  Container () {/*package-private*/}
  public void size() { System.out.println(10); }
}
Run Code Online (Sandbox Code Playgroud)
package foo;
public final class Bucket extends Container {}
Run Code Online (Sandbox Code Playgroud)
package bar;
public final class Oops extends Container {}
Run Code Online (Sandbox Code Playgroud)

编译错误:默认构造函数不显示隐式超级构造函数Container().必须定义一个显式构造函数


public final class Oops extends Container {
  public Oops() {}
}
Run Code Online (Sandbox Code Playgroud)

编译错误:隐式超级构造函数Container()不可见.必须显式调用另一个构造函数

当然,没有其他构造函数,所以无法完成.