在Java中,原始类型和数组是否包含包含?
在Java中,原始类型和数组是否包含包含?
可能不是,但只是想确定。
简单的答案
我们来测试一下:
public static void main(final String[] args){ System.out.println(long.class.getPackage()); System.out.println(Object[].class.getPackage()); }
输出:
空值
空值
不,他们没有:-)
原始类型
原始类是没有包的特殊构造。 有关参考,请参阅Long.TYPE
的来源, Long.TYPE
是Long.TYPE
的别名:
/** * The
Class
instance representing the primitive type *long
. * * @since JDK1.1 */ public static final ClassTYPE = (Class ) Class.getPrimitiveClass("long");
如您所见,基本类是通过包私有和本机机制加载的:
static native Class getPrimitiveClass(String name);
并转换为Class
(为了启用自动装箱,我猜)
包装类型及其原始类型
顺便说一句:每个包装类都有一个名为TYPE
的静态final字段,它映射到相应的基本类,如下面的代码所示:
private static Class> getPrimitiveClass(final Class> wrapperClass){ try{ final Field field = wrapperClass.getDeclaredField("TYPE"); final int modifiers = field.getModifiers(); if(Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) && Class.class.equals(field.getType())){ return (Class>) field.get(null); } else{ throw new IllegalArgumentException("This is not a wrapper class: " + wrapperClass); } } catch(final NoSuchFieldException e){ throw new IllegalArgumentException("This is not a wrapper class:" + wrapperClass + ", field TYPE doesn't exists.", e); } catch(final IllegalAccessException e){ throw new IllegalArgumentException("This is not a wrapper class:" + wrapperClass + ", field TYPE can't be accessed.", e); } } public static void main(final String[] args){ final List> wrappers = Arrays.> asList( Byte.class, Long.class, Integer.class, Short.class, Boolean.class, Double.class // etc. ); for(final Class> clazz : wrappers){ System.out.println("Wrapper type: " + clazz.getName() + ", primitive type: " + getPrimitiveClass(clazz).getCanonicalName()); } }
输出:
包装类型:java.lang.Byte,原始类型:byte
包装类型:java.lang.Long,原始类型:long
包装类型:java.lang.Integer,原始类型:int
包装类型:java.lang.Short,原始类型:short
包装类型:java.lang.Boolean,原始类型:boolean
包装类型:java.lang.Double,原始类型:double
数组类型
可以通过Array.newInstance(type, length)
创建数组,它在内部调用此方法:
private static native Object newArray(Class componentType, int length) throws NegativeArraySizeException;
所以,类是由本机代码创建的特殊构造(并且它们没有包,否则你可以在某处找到它们)
不,他们没有,因为他们不是上课。
基元 :基本类型由语言预定义,并由保留关键字命名。
array :数组是一个容器对象,它包含固定数量的单个类型的值。
不,但是有一些对象可以在java.lang
包中包装原始数据类型。
http://download.oracle.com/javase/6/docs/api/java/lang/package-summary.html
不,因为它们是语言结构而不是类本身。
但是,您可以在包装器中有一个表示基本类型的类,例如:
Integer.TYPE等。 对reflection很有用。
但是你会看到那些没有包的东西,即。
Integer.TYPE.getPackage()
返回null