Java: 如何创建一个 public class 可以在包内被子class,同时防止外人继承?
Java: How to create a public class that can be subclassed within package, while preventing outsiders from inheriting?
假设我正在写一个包。我有以下继承层次结构,都在我的包中:
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;
}
}
我想防止其他人子类化Container
。但是我做不到 final
因为 Bucket
和 Bag
是子类。而且我必须做到public
,否则外人无法调用getContainer()
。在 Java 中有没有办法做到这一点?否则,人们在这种情况下会做什么?
为了防止 class 被其他包中的 class 子class 编辑,使所有构造函数 package-private .
如果class没有任何构造函数,它有implicit default constructor,也就是public,所以你需要显式地创建一个包私有的无参数构造函数.
package foo;
public class Container {
Container () {/*package-private*/}
public void size() { System.out.println(10); }
}
package foo;
public final class Bucket extends Container {}
package bar;
public final class Oops extends Container {}
编译错误:隐式超级构造函数 Container() 对于默认构造函数不可见。必须定义显式构造函数
public final class Oops extends Container {
public Oops() {}
}
编译错误:隐式超级构造函数 Container() 不可见。必须显式调用另一个构造函数
当然没有其他的构造器,所以做不到
假设我正在写一个包。我有以下继承层次结构,都在我的包中:
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;
}
}
我想防止其他人子类化Container
。但是我做不到 final
因为 Bucket
和 Bag
是子类。而且我必须做到public
,否则外人无法调用getContainer()
。在 Java 中有没有办法做到这一点?否则,人们在这种情况下会做什么?
为了防止 class 被其他包中的 class 子class 编辑,使所有构造函数 package-private .
如果class没有任何构造函数,它有implicit default constructor,也就是public,所以你需要显式地创建一个包私有的无参数构造函数.
package foo;
public class Container {
Container () {/*package-private*/}
public void size() { System.out.println(10); }
}
package foo;
public final class Bucket extends Container {}
package bar;
public final class Oops extends Container {}
编译错误:隐式超级构造函数 Container() 对于默认构造函数不可见。必须定义显式构造函数
public final class Oops extends Container {
public Oops() {}
}
编译错误:隐式超级构造函数 Container() 不可见。必须显式调用另一个构造函数
当然没有其他的构造器,所以做不到