java 中默认的数组 declared/initialized 是怎样的?
How is an array declared/initialized by default in java?
我想问一下 java 中数组的默认访问权限 specifiers/modifiers 是什么?
例如,如果我写
int arr[];
默认情况下会是什么?
默认是public abstract final
还是public
?
我问这个问题是因为我无法理解 Tom Ball 的评论。
I found why default serialVersionUIDs for arrays were different. That calculation includes the class's modifiers, and it turns out all arrays are "public abstract final", not "public" (a new "gotcha" Java interview question :-). Changing that in the runtime, and now all arrays have the same UIDs, even different object classes.
这里是linkhttps://groups.google.com/d/msg/j2objc-discuss/1zCZYvxBGhY/ZpIRKPLFBgAJ
谁能解释一下?
您链接的 post 是指代表数组的(动态创建的,合成的)class 对象的访问修饰符:在您的例子中是 int[].class
。
class的修饰符与字段的修饰符没有关系
可以这样想:class java.lang.String
是 public
,但是你可以自由地创建一个 private
字符串类型的字段。
当你写一个像
这样的声明时
int arr[];
您正在声明一个变量。该变量具有您声明的那些访问修饰符。如果你没有在 class 变量上指定任何修饰符,默认情况下它将是包私有的。请注意,变量可以 永远不会 是 abstract
.
您不理解引用文本的原因是,您将变量类型的 class 修饰符与 混淆了变量的修饰符。
撇开数组不谈,如果你声明了一个像Foo bar
这样的变量,那么classFoo
的修饰符独立于变量bar
的修饰符。
现在,这同样适用于数组类型。在 Java 中,数组是对象,因此具有 class 类型。在运行时,您可以像在任何其他对象上一样在数组上调用 getClass()
,您将获得一个代表合成 class 的 Class
对象。您还可以通过 class 文字访问数组 class:
Class<?> clazz=int[].class; // int[]
int mod=clazz.getModifiers();
if(Modifier.isPublic(mod)) System.out.print("public ");
if(Modifier.isAbstract(mod)) System.out.print("abstract ");
if(Modifier.isFinal(mod)) System.out.print("final ");
System.out.print(clazz);
System.out.print(" implements");
for(Class<?> cl:clazz.getInterfaces())
System.out.print(" "+cl.getName());
System.out.println();
它将打印
public abstract final class [I implements java.lang.Cloneable java.io.Serializable
表明表示数组类型int[]
的class具有特殊名称[I
和修饰符abstract
和final
,组合即普通 classes.
不可能
请注意,数组 class 是 public
,如果它是原始值数组或其元素类型也是 public
。如前所述,这不会阻止您声明此类类型的非 public
变量。
我想问一下 java 中数组的默认访问权限 specifiers/modifiers 是什么? 例如,如果我写
int arr[];
默认情况下会是什么?
默认是public abstract final
还是public
?
我问这个问题是因为我无法理解 Tom Ball 的评论。
I found why default serialVersionUIDs for arrays were different. That calculation includes the class's modifiers, and it turns out all arrays are "public abstract final", not "public" (a new "gotcha" Java interview question :-). Changing that in the runtime, and now all arrays have the same UIDs, even different object classes.
这里是linkhttps://groups.google.com/d/msg/j2objc-discuss/1zCZYvxBGhY/ZpIRKPLFBgAJ
谁能解释一下?
您链接的 post 是指代表数组的(动态创建的,合成的)class 对象的访问修饰符:在您的例子中是 int[].class
。
class的修饰符与字段的修饰符没有关系
可以这样想:class java.lang.String
是 public
,但是你可以自由地创建一个 private
字符串类型的字段。
当你写一个像
这样的声明时int arr[];
您正在声明一个变量。该变量具有您声明的那些访问修饰符。如果你没有在 class 变量上指定任何修饰符,默认情况下它将是包私有的。请注意,变量可以 永远不会 是 abstract
.
您不理解引用文本的原因是,您将变量类型的 class 修饰符与 混淆了变量的修饰符。
撇开数组不谈,如果你声明了一个像Foo bar
这样的变量,那么classFoo
的修饰符独立于变量bar
的修饰符。
现在,这同样适用于数组类型。在 Java 中,数组是对象,因此具有 class 类型。在运行时,您可以像在任何其他对象上一样在数组上调用 getClass()
,您将获得一个代表合成 class 的 Class
对象。您还可以通过 class 文字访问数组 class:
Class<?> clazz=int[].class; // int[]
int mod=clazz.getModifiers();
if(Modifier.isPublic(mod)) System.out.print("public ");
if(Modifier.isAbstract(mod)) System.out.print("abstract ");
if(Modifier.isFinal(mod)) System.out.print("final ");
System.out.print(clazz);
System.out.print(" implements");
for(Class<?> cl:clazz.getInterfaces())
System.out.print(" "+cl.getName());
System.out.println();
它将打印
public abstract final class [I implements java.lang.Cloneable java.io.Serializable
表明表示数组类型int[]
的class具有特殊名称[I
和修饰符abstract
和final
,组合即普通 classes.
请注意,数组 class 是 public
,如果它是原始值数组或其元素类型也是 public
。如前所述,这不会阻止您声明此类类型的非 public
变量。