[英]Modifiers used for Classes in Java
我知道 Java 中的類僅使用“公共”和“默認(無修飾符)”,當您嘗試將 class 聲明為“私有”或“受保護”時,它會發出編譯錯誤,這對我來說很有意義。
但是,為什么這個頁面會說“類可以有上面提到的 4 個中的任何修飾符”。
有人可以向我解釋一下嗎?
還有更多的合法組合。 只是為了好玩,我寫了一個小腳本來生成所有可能的組合,然后我刪除了導致編譯錯誤的那些,這些是我留下的合法組合:
class Test {
class Default__ConcreteInstanceVirtualLoosefp_Class {}
interface Default__ConcreteInstanceVirtualLoosefp_Interface {}
record Default__ConcreteInstanceVirtualLoosefp_Record() {}
strictfp class Default__ConcreteInstanceVirtualStrictfpClass {}
strictfp interface Default__ConcreteInstanceVirtualStrictfpInterface {}
strictfp record Default__ConcreteInstanceVirtualStrictfpRecord() {}
final class Default__ConcreteInstanceFinal__Loosefp_Class {}
final record Default__ConcreteInstanceFinal__Loosefp_Record() {}
final strictfp class Default__ConcreteInstanceFinal__StrictfpClass {}
final strictfp record Default__ConcreteInstanceFinal__StrictfpRecord() {}
static class Default__ConcreteStatic__VirtualLoosefp_Class {}
static interface Default__ConcreteStatic__VirtualLoosefp_Interface {}
static record Default__ConcreteStatic__VirtualLoosefp_Record() {}
static strictfp class Default__ConcreteStatic__VirtualStrictfpClass {}
static strictfp interface Default__ConcreteStatic__VirtualStrictfpInterface {}
static strictfp record Default__ConcreteStatic__VirtualStrictfpRecord() {}
static final class Default__ConcreteStatic__Final__Loosefp_Class {}
static final record Default__ConcreteStatic__Final__Loosefp_Record() {}
static final strictfp class Default__ConcreteStatic__Final__StrictfpClass {}
static final strictfp record Default__ConcreteStatic__Final__StrictfpRecord() {}
abstract class Default__AbstractInstanceVirtualLoosefp_Class {}
abstract interface Default__AbstractInstanceVirtualLoosefp_Interface {}
abstract strictfp class Default__AbstractInstanceVirtualStrictfpClass {}
abstract strictfp interface Default__AbstractInstanceVirtualStrictfpInterface {}
abstract static class Default__AbstractStatic__VirtualLoosefp_Class {}
abstract static interface Default__AbstractStatic__VirtualLoosefp_Interface {}
abstract static strictfp class Default__AbstractStatic__VirtualStrictfpClass {}
abstract static strictfp interface Default__AbstractStatic__VirtualStrictfpInterface {}
public class Public___ConcreteInstanceVirtualLoosefp_Class {}
public interface Public___ConcreteInstanceVirtualLoosefp_Interface {}
public record Public___ConcreteInstanceVirtualLoosefp_Record() {}
public strictfp class Public___ConcreteInstanceVirtualStrictfpClass {}
public strictfp interface Public___ConcreteInstanceVirtualStrictfpInterface {}
public strictfp record Public___ConcreteInstanceVirtualStrictfpRecord() {}
public final class Public___ConcreteInstanceFinal__Loosefp_Class {}
public final record Public___ConcreteInstanceFinal__Loosefp_Record() {}
public final strictfp class Public___ConcreteInstanceFinal__StrictfpClass {}
public final strictfp record Public___ConcreteInstanceFinal__StrictfpRecord() {}
public static class Public___ConcreteStatic__VirtualLoosefp_Class {}
public static interface Public___ConcreteStatic__VirtualLoosefp_Interface {}
public static record Public___ConcreteStatic__VirtualLoosefp_Record() {}
public static strictfp class Public___ConcreteStatic__VirtualStrictfpClass {}
public static strictfp interface Public___ConcreteStatic__VirtualStrictfpInterface {}
public static strictfp record Public___ConcreteStatic__VirtualStrictfpRecord() {}
public static final class Public___ConcreteStatic__Final__Loosefp_Class {}
public static final record Public___ConcreteStatic__Final__Loosefp_Record() {}
public static final strictfp class Public___ConcreteStatic__Final__StrictfpClass {}
public static final strictfp record Public___ConcreteStatic__Final__StrictfpRecord() {}
public abstract class Public___AbstractInstanceVirtualLoosefp_Class {}
public abstract interface Public___AbstractInstanceVirtualLoosefp_Interface {}
public abstract strictfp class Public___AbstractInstanceVirtualStrictfpClass {}
public abstract strictfp interface Public___AbstractInstanceVirtualStrictfpInterface {}
public abstract static class Public___AbstractStatic__VirtualLoosefp_Class {}
public abstract static interface Public___AbstractStatic__VirtualLoosefp_Interface {}
public abstract static strictfp class Public___AbstractStatic__VirtualStrictfpClass {}
public abstract static strictfp interface Public___AbstractStatic__VirtualStrictfpInterface {}
private class Private__ConcreteInstanceVirtualLoosefp_Class {}
private interface Private__ConcreteInstanceVirtualLoosefp_Interface {}
private record Private__ConcreteInstanceVirtualLoosefp_Record() {}
private strictfp class Private__ConcreteInstanceVirtualStrictfpClass {}
private strictfp interface Private__ConcreteInstanceVirtualStrictfpInterface {}
private strictfp record Private__ConcreteInstanceVirtualStrictfpRecord() {}
private final class Private__ConcreteInstanceFinal__Loosefp_Class {}
private final record Private__ConcreteInstanceFinal__Loosefp_Record() {}
private final strictfp class Private__ConcreteInstanceFinal__StrictfpClass {}
private final strictfp record Private__ConcreteInstanceFinal__StrictfpRecord() {}
private static class Private__ConcreteStatic__VirtualLoosefp_Class {}
private static interface Private__ConcreteStatic__VirtualLoosefp_Interface {}
private static record Private__ConcreteStatic__VirtualLoosefp_Record() {}
private static strictfp class Private__ConcreteStatic__VirtualStrictfpClass {}
private static strictfp interface Private__ConcreteStatic__VirtualStrictfpInterface {}
private static strictfp record Private__ConcreteStatic__VirtualStrictfpRecord() {}
private static final class Private__ConcreteStatic__Final__Loosefp_Class {}
private static final record Private__ConcreteStatic__Final__Loosefp_Record() {}
private static final strictfp class Private__ConcreteStatic__Final__StrictfpClass {}
private static final strictfp record Private__ConcreteStatic__Final__StrictfpRecord() {}
private abstract class Private__AbstractInstanceVirtualLoosefp_Class {}
private abstract interface Private__AbstractInstanceVirtualLoosefp_Interface {}
private abstract strictfp class Private__AbstractInstanceVirtualStrictfpClass {}
private abstract strictfp interface Private__AbstractInstanceVirtualStrictfpInterface {}
private abstract static class Private__AbstractStatic__VirtualLoosefp_Class {}
private abstract static interface Private__AbstractStatic__VirtualLoosefp_Interface {}
private abstract static strictfp class Private__AbstractStatic__VirtualStrictfpClass {}
private abstract static strictfp interface Private__AbstractStatic__VirtualStrictfpInterface {}
protected class ProtectedConcreteInstanceVirtualLoosefp_Class {}
protected interface ProtectedConcreteInstanceVirtualLoosefp_Interface {}
protected record ProtectedConcreteInstanceVirtualLoosefp_Record() {}
protected strictfp class ProtectedConcreteInstanceVirtualStrictfpClass {}
protected strictfp interface ProtectedConcreteInstanceVirtualStrictfpInterface {}
protected strictfp record ProtectedConcreteInstanceVirtualStrictfpRecord() {}
protected final class ProtectedConcreteInstanceFinal__Loosefp_Class {}
protected final record ProtectedConcreteInstanceFinal__Loosefp_Record() {}
protected final strictfp class ProtectedConcreteInstanceFinal__StrictfpClass {}
protected final strictfp record ProtectedConcreteInstanceFinal__StrictfpRecord() {}
protected static class ProtectedConcreteStatic__VirtualLoosefp_Class {}
protected static interface ProtectedConcreteStatic__VirtualLoosefp_Interface {}
protected static record ProtectedConcreteStatic__VirtualLoosefp_Record() {}
protected static strictfp class ProtectedConcreteStatic__VirtualStrictfpClass {}
protected static strictfp interface ProtectedConcreteStatic__VirtualStrictfpInterface {}
protected static strictfp record ProtectedConcreteStatic__VirtualStrictfpRecord() {}
protected static final class ProtectedConcreteStatic__Final__Loosefp_Class {}
protected static final record ProtectedConcreteStatic__Final__Loosefp_Record() {}
protected static final strictfp class ProtectedConcreteStatic__Final__StrictfpClass {}
protected static final strictfp record ProtectedConcreteStatic__Final__StrictfpRecord() {}
protected abstract class ProtectedAbstractInstanceVirtualLoosefp_Class {}
protected abstract interface ProtectedAbstractInstanceVirtualLoosefp_Interface {}
protected abstract strictfp class ProtectedAbstractInstanceVirtualStrictfpClass {}
protected abstract strictfp interface ProtectedAbstractInstanceVirtualStrictfpInterface {}
protected abstract static class ProtectedAbstractStatic__VirtualLoosefp_Class {}
protected abstract static interface ProtectedAbstractStatic__VirtualLoosefp_Interface {}
protected abstract static strictfp class ProtectedAbstractStatic__VirtualStrictfpClass {}
protected abstract static strictfp interface ProtectedAbstractStatic__VirtualStrictfpInterface {}
}
因此,如果包括 14 個實驗record
,或單獨計算,則總共有 112 個合法組合, record
s 的修飾符的合法組合為 32 個, interface
s 也為 32 個,如果僅計算類,則為 48 個。
最明顯的非法組合是:
abstract
和final
: abstract
的意思是“包含必須由子類實現的未實現的成員”,而final
的意思是“不能被子類化”,很明顯,需要子類化但不能有子類的 class 沒有意義。final
的interface
interface
隱式的完全abstract
的,因為它應該由其實現class
es 來實現。record
是隱含的final
,因此它們不能是abstract
。正如文中所說:
並非所有類都允許使用所有修飾符
但是,例如, 內部類可以是私有的/受保護的。
public class Foo {
private Bar bar = new Bar(42);
private static class Bar {
private int answer;
Bar(int theAnswer) {
this.answer = theAnswer;
}
}
}
這對於一些持有數據的 POJO 或一些您想要封裝但不會泄漏的內部實現細節是有意義的(如果它受到保護,您甚至可以覆蓋)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.