当前位置: 首页 > 面试题库 >

在Java中,原始类型和数组是否具有包含包?

芮瑾瑜
2023-03-14
问题内容

在Java中,原始类型和数组是否具有包含包?

可能不是,但是只是想确定一下。


问题答案:

简单答案

让我们测试一下:

public static void main(final String[] args){
    System.out.println(long.class.getPackage());
    System.out.println(Object[].class.getPackage());
}

输出:


null

不,他们不:-)

基本类型

原始类是没有包的特殊构造。供参考,请参阅的来源Long.TYPE,别名为long.class

/**
 * The <code>Class</code> instance representing the primitive type
 * <code>long</code>.
 *
 * @since   JDK1.1
 */
public static final Class<Long> TYPE =
       (Class<Long>) Class.getPrimitiveClass("long");

如您所见,原始类是通过package-private和native机制加载的:

static native Class getPrimitiveClass(String name);

并投射到Class<Long>(我想为了启用自动装箱)

包装器类型及其原始类型

顺便说一句:每个包装器类都有一个静态的final字段TYPE,该字段映射到相应的原始类,如以下代码所示:

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<Class<?>> wrappers =
        Arrays.<Class<?>> 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,原始类型:字节
包装类型:java.lang.Long,原始类型:long
包装类型:java.lang.Integer,原始类型:int
包装类型:java.lang.Short,原始类型:简短的
包装类型:java.lang.Boolean,原始类型:布尔
型包装类型:java.lang.Double,原始类型:double

数组类型

可以通过创建数组Array.newInstance(type, length),该数组在内部调用此方法:

private static native Object newArray(Class componentType, int length)
throws NegativeArraySizeException;

同样,这些类是由本机代码创建的特殊结构(它们没有包,否则您可以在某个地方找到它们)



 类似资料:
  • 问题内容: 我正在将代码从Java手动转换为C#,并在原始类型(我称之为)方面苦苦挣扎(请参见例如,自动装箱和拆箱在Java和C#中的行为是否不同)。从答案中我了解到(C#)和(C#)是等效的,并且(C#)也可以在容器中使用,例如,作为Dictionary中的键。但是,(Java)不能在HashMap这样的容器中使用,这就是为什么将其自动装箱到(Java)。 是(C#)一个原始或对象? 如果它是原

  • 问题内容: 如果我在代码中使用如下语句 它将数组初始化为特定的东西吗?(例如0)我似乎记得此文件记录在某处,但我不确定要搜索什么。 问题答案: JLS说,在15.10数组创建表达式中 […]创建具有指定长度的一维数组,并将数组的每个组件初始化为其默认值 在4.12.5变量的初始值处表示: 对于type ,默认值为零,即。

  • 问题内容: 如果有Wrapper类使Java成为纯面向对象的语言,那么为什么会有可在Java中使用的Primitive数据类型呢? 问题答案: 为了效率。基本类型的变量直接包含值。非基本类型的变量是引用,引用存储在内存中其他位置的对象。 每次您需要使用包装器类型的值时,JVM都需要在内存中查找对象以获取该值。对于原始类型,这不是必需的,因为变量本身包含值,而不是对包含该值的对象的引用。 但是,这不

  • 问题内容: 我是Kotlin的新手,正在玩数据类型。我选择了一个类型,然后尝试通过说来将其强制转换为a ,这在Java中是有效的(从语法上讲,但这是正确的)。但是,此操作失败,表示无法将Int强制转换为Double。我假设这是因为它是基于Integer类而不是原始的int数据类型构建的。我是正确的,最有价值的方法是什么?有一个功能,但这似乎效率低下且笨拙。 问题答案: 我花了一个类型,然后试图将它

  • 问题内容: 我今天遇到了与此类似的代码。 似乎暗示数据类型信息可以与NULL值关联。这是否将元数据附加到将其标识为指定数据类型的NULL值? 这篇文章详细介绍了一种在SqlServer中查找数据类型的方法,但是当我尝试以下行时,它以NULL的形式返回: 问题答案: 在SQL Server中,是在默认情况下所有我能想到的场景。您可以使用以下代码确定这一点: 结果: 在将其放入表中或将其与某些上下文元