在对Java类型进行一些反思的过程中,我遇到了一个我不理解的奇怪现象.
检查int其修饰的回报public,abstract和final.我理解public并且final,但对于我来说,abstract原始类型的存在是不明显的.为什么会这样?
编辑:我没有反思,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())));
}
}
Run Code Online (Sandbox Code Playgroud)
运行时的输出:
int.class == Integer.class -> false
int.class modifiers: public abstract final
Integer.class modifiers: public final
Run Code Online (Sandbox Code Playgroud)
抽象类是一个不完整的类,或者被认为是不完整的类.
根据定义,可能没有实例int.class.你无法编译这种代码:
int a = new int();
Run Code Online (Sandbox Code Playgroud)
没有构造函数int.没有创建对象. int.class甚至没有扩展Object.如果您运行以下代码行,您将得到null结果.
System.out.println(int.class.getSuperclass());
Run Code Online (Sandbox Code Playgroud)
因此,因为你永远不会拥有真实的实例int.class,所以根据定义abstract.此外,根据Integer API,Integer.TYPE字段(包含int.class)是一个仅表示基本类型的类.
以下代码证明了这一点:
int a = 4;
System.out.println(int.class.isInstance(a));
Run Code Online (Sandbox Code Playgroud)
这回来了false.
因此,int.class可能只是在系统中用于表示目的,如IntegerAPI 中所述.事实上,还有一种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());
}
}
Run Code Online (Sandbox Code Playgroud)
如果你跑
System.out.println(Modifier.toString(int.class.getModifiers()));
Run Code Online (Sandbox Code Playgroud)
你得到
public abstract final
Run Code Online (Sandbox Code Playgroud)
可能是因为您无法将其子类化-即final,并且您无法实例化它-即抽象。
从Oracle的抽象方法和类
抽象类不能实例化,但是可以被子类化。
事实是它也是最终的含义,它不能是子类。
| 归档时间: |
|
| 查看次数: |
1980 次 |
| 最近记录: |