在java中,默认情况下如何声明/初始化数组?

在java中,默认情况下如何声明/初始化数组?,java,arrays,serialization,access-modifiers,Java,Arrays,Serialization,Access Modifiers,我想问,java中数组的默认访问说明符/修饰符是什么? 例如,如果我写 int arr[]; 默认情况下会是什么? 默认情况下是public abstract final还是public 我问这个问题是因为我无法理解汤姆·鲍尔的评论 我发现了为什么数组的默认SerialVersionUID不同。该计算包括类的修饰符,结果表明所有数组都是“public abstract final”,而不是“public”(一个新的“gotcha”Java面试问题:-)。在运行时改变这一点,现在所有数组都有相同

我想问,java中数组的默认访问说明符/修饰符是什么? 例如,如果我写

int arr[];
默认情况下会是什么? 默认情况下是
public abstract final
还是
public

我问这个问题是因为我无法理解汤姆·鲍尔的评论

我发现了为什么数组的默认SerialVersionUID不同。该计算包括类的修饰符,结果表明所有数组都是“public abstract final”,而不是“public”(一个新的“gotcha”Java面试问题:-)。在运行时改变这一点,现在所有数组都有相同的UID,甚至不同的对象类

这里是链接


有人能解释一下吗?

您链接的帖子引用了(动态创建的合成)类对象的访问修饰符,该类对象表示数组:
int[].class

类的修饰符和字段的修饰符之间没有关系


可以这样想:类
java.lang.String
public
,但是您可以自由创建一个
private
字符串类型的字段

int arr[];
您正在声明一个变量。此变量正好具有您要声明的访问修饰符。如果不在类变量上指定任何修饰符,默认情况下它将是包私有的。请注意,变量永远不能是抽象的

您不理解引用的文本的原因是,您混淆了变量类型的类修饰符和变量的修饰符

撇开数组不谈,如果您声明一个变量,比如
Foo bar
,那么类
Foo
具有独立于变量
bar
的修饰符的修饰符

现在,这同样适用于数组类型。在Java中,数组是对象,因此具有类类型。在运行时,您可以像在任何其他对象上一样在数组上调用
getClass()
,您将得到一个表示合成类的
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();
显示表示数组类型
int[]
的类具有特殊名称
[I
和修饰符
abstract
final
,这是普通类无法实现的组合


请注意,如果数组类是基本值数组或其元素类型也是公共的,那么它就是公共的。如前所述,这不会阻止您声明这种类型的非公共变量。

与其他变量相同。数组没有特殊行为。它不是公共的,n或者
public abstract final
。它是包私有的。它不是
public
,因为没有修饰符表示“包私有的”。它不是最终的,因为你没有声明它是最终的。它不是抽象的,因为你没有声明一个类。嗨,伙计们。很抱歉没有完整的信息。这个问题不是重复的。它现在是完整的。请你解释一下,而不是投票否决这个帖子!非常感谢霍尔格的解释。一个很好的解释!!!!!确切地说什么我在找的是……)
public abstract final class [I implements java.lang.Cloneable java.io.Serializable