gpt4 book ai didi

java - 为什么 Java 原始类型的修饰符是 public、abstract 和 final?

转载 作者:IT老高 更新时间:2023-10-28 21:02:06 25 4
gpt4 key购买 nike

在对 Java 类型进行一些反射(reflection)的过程中,我遇到了一个我不理解的奇怪现象。

检查 int 的修饰符会返回 publicabstractfinal。我了解 publicfinal,但是对于原始类型,abstract 的存在对我来说并不明显。为什么会这样?

编辑:我不是在反射(reflect) Integer 而是在 int:

import java.lang.reflect.Modifier;

public class IntegerReflection {
public static void main(final String[] args) {
System.out.println(String.format("int.class == Integer.class -> %b", int.class == Integer.class));
System.out.println(String.format("int.class modifiers: %s", Modifier.toString(int.class.getModifiers())));
System.out.println(String.format("Integer.class modifiers: %s", Modifier.toString(Integer.class.getModifiers())));
}
}

运行时的输出:

int.class == Integer.class -> false
int.class modifiers: public abstract final
Integer.class modifiers: public final

最佳答案

根据JLS 8.1.1.1 - Abstract Classes :

An abstract class is a class that is incomplete, or to be considered incomplete.

根据定义,不能有 int.class 的实例。你不能编译这种代码:

int a = new int();

int 没有构造函数。没有创建对象。 int.class 甚至不扩展 Object。如果您运行以下代码行,您将得到 null 作为结果。

System.out.println(int.class.getSuperclass());

所以因为你永远不可能有一个真正的 int.class 实例,所以它是定义为 abstract 的。此外,根据 Integer APIInteger.TYPE 字段(包含 int.class)是一个仅表示原始类型的类。

以下代码证明了这一点:

int a = 4;
System.out.println(int.class.isInstance(a));

这会返回 false

因此,int.class 可能只是在系统中用于表示目的,如 Integer API 中所述。还有一个 void.class 类型但没有 null.class 类型的事实让我认为这主要用于反射。不过,这只是推测。


如果有人感兴趣,int.class 基本上不包含反射包可识别的任何内容,并且可能只是一个虚拟类。如果你运行下面的代码,你会发现它没有构造函数,没有字段,也没有方法。

Method[] intMethods = int.class.getMethods();

if(intMethods.length == 0) {
System.out.println("No methods.");
}
else {
for(Method method : intMethods) {
System.out.println(method.getName());
}
}

Constructor[] intConstructors = int.class.getConstructors();

if(intConstructors.length == 0) {
System.out.println("No constructors.");
}
else {
for(Constructor constructor: intConstructors) {
System.out.println(constructor.getName());
}
}

Field[] intFields = int.class.getFields();

if(intFields.length == 0) {
System.out.println("No fields.");
}
else {
for(Field field: intFields) {
System.out.println(field.getName());
}
}

关于java - 为什么 Java 原始类型的修饰符是 public、abstract 和 final?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13180600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com