类和类型之间的区别

时间:2013-05-17 03:04:33

标签: java class types

刚接触Java,我对类型的概念感到困惑。 例如,对象"Hello World!"是否属于类型 String String?或者两者兼而有之?

6 个答案:

答案 0 :(得分:115)

一个类是一种类型。接口是一种类型。原语是一种类型。数组是一种类型。

因此,每个类型也可以是一个类(包括枚举常量),接口,基元或数组。

有两种不同类型的类型:基本类型和引用类型:

  • 基本类型的变量始终包含相同类型的原始值。只能通过对该变量的赋值操作来更改此类值。
  • 引用类型的变量始终保存对象的引用值。所有对象(包括数组)都支持类Object的方法。引用类型是类类型(包括枚举类型),接口类型和数组类型。

每个数据都有一个定义其结构的类型,即它占用了多少内存,如何布局,更重要的是,如何与它进行交互。

原始类型的示例:

  1. int
  2. float
  3. char
  4. boolean
  5. 班级类型的例子:

    1. String
    2. Integer
    3. Boolean
    4. ArrayList
    5. StringBuilder
    6. 界面类型示例:

      1. Collection
      2. List
      3. Map
      4. Serializable
      5. 数组类型示例:

        1. int[]
        2. String[]
        3. Integer[][][]
        4. 基本上,任何你可以称为变量的东西都有一个类型,而类是一种类型。

          此处有更多信息:http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html

答案 1 :(得分:4)

“类型”是更具包容性的类别。 Java中的变量可以有三种类型:8“原始”类型,如int和float,接口和类。值(与变量相对)可以是原始实例或类实例。

答案 2 :(得分:2)

“类型”定义“它是什么类型的数据”

Ex:“你好世界”是一个字符串 - > “hello world”是String类型(String不是一个与int不同的premetive数据。所以我们可以说“hello world”是一个字符串类类型)

10是int - > 10是整数数据类型。

答案 3 :(得分:2)

TLDR -类是Java中的类型之一。

注意-要完全理解答案,您必须对Java中的泛型有一点了解。


要了解差异,让我们首先了解Java中的 Type

根据JLS SE 10

  

Java编程语言中有两种类型:   原始类型§4.2)和引用类型(第4.3节)。

什么是原始类型?

  

a)整数类型为 byte,short,int和long ,其值为   8位,16位,32位和64位带符号的二进制补码整数,   分别为 char ,其值为16位无符号整数   代表UTF-16代码单元(第3.1节)。

     

b)浮点类型为 float ,其值包括32位   IEEE 754浮点数和 double ,其值包括   64位IEEE 754浮点数。

     

c)布尔类型恰好具有两个值:true和false。

现在,让我们看看什么是引用类型?

  

引用类型有四种:类类型§8.1),界面   类型§9.1),类型变量§4.4)和数组类型§10.1)。

让我们一一讨论。

如果您在JLS中看到了如何,的定义如下:

  

类声明指定了新的命名引用类型。

     

有两种类声明:普通类声明   和枚举声明

ClassDeclaration:
NormalClassDeclaration 
EnumDeclaration
NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody

您看到[TypeParameters],这表明类类型包括那些  通用类。

class Example<T>{

}

该类的类型将称为Example

简而言之,类类型涵盖了我们的枚举,我们的常规(非通用)类(例如String等)以及我们的通用类。

类似地,我希望接口和数组类型也很清楚。对于数组类型,我们的意思是像int[]String[]等。

让我们进入最后一部分-类型变量。他们是什么?

  

类型变量是在类中用作类型的不合格标识符,   接口,方法和构造函数主体。

通过下面的JLS中的示例让我们理解。

class Test {
    <T extends C & I> void test(T t) {  
        t.mI();           // OK
        t.mCPublic();     // OK 
        t.mCProtected();  // OK 
        t.mCPackage();    // OK

    } 
}

您看到方法参数中的对象类型为T。是的,此T是Type变量,可以用作参考。是的。 (无法理解这个奇怪的例子-了解什么是Java中的通用方法)

这完成了答案。

答案 4 :(得分:1)

这是一个有关编程术语的问题,并且正如预期的那样,还有另一个答案可以被认为是有效的。

反射API公开的Java类型系统具有两种类型:Class<T>类和Type接口,它们由前者实现。在此系统中,类(由df1 <- read.table(text = " ID Var1 Var2 1 2 0 1 8 0 1 12 0 1 11 1 1 10 1 2 5 0 2 8 0 2 7 0 2 6 1 2 5 1 ", header = TRUE) 实例描述的元素)是使用关键字def sort(nums): for i in range(len(nums)-1,0,-1): for j in range(i): if nums[j]>nums[j+1]: temp = nums[j] nums[j] = nums[j+1] nums[j+1] = temp Class<T>创建的任何类型,任何原始类型,其任何数组以及class。其他一切都只是interface

那还有什么呢?尽管在这种情况下,一个类是运行时在考虑对象功能时可以看到并可以访问的所有内容,但通常,类型是编译器可以看到的所有内容。这可以是parametrized type(例如void –请记住,类型擦除会导致每个Type在运行时映射到相同的类),这是{方法或类声明,generic type parameter和任何wildcard type。在所有类型擦除无效的地方,API方法都会公开这些类型, 例如遍历参数类型或基本类型时。

答案 5 :(得分:0)

类型与编译时实体(如变量和表达式)相关联,而类与运行时实体(如内存中对象)相关联。考虑规范中使用的语言 15.5. Expressions and Run-Time Checks

<块引用>

如果表达式的类型是引用类型,则其类 被引用的对象... 类型为引用类型的表达式可以使用 instanceof 进行测试,以找出表达式的运行时值所引用的对象的类...

Practical Foundations for Programming Languages 的作者罗伯特·哈珀 (Robert Harper) 做出以下distinction

<块引用>

我确实认为仔细区分类别很重要,这可能 附加到对象,从类型,这是静态分类器

Java 泛型是与此区别相关的一个示例。首先考虑以下代码段

String greeting = "Hello" + " " + "world!"; 
  • 变量 greeting 的编译时类型是 String
  • 表达式 "Hello" + " " + "world!" 的编译时类型是 String
  • 变量Hello world!引用的实例化对象greetings的运行时类是String

在上面的例子中,区别并不重要,但是让我们在下面的代码片段上尝试类似的推理

List<String> greetings = List.of("Hello World!");
  • 变量 greetings 的编译时类型是 List<String>
  • 表达式 new ArrayList("Hello World!") 的编译时类型是 List<String>
  • 变量greetings引用的实例化对象的运行时类是ImmutableCollections$List1

现在我们看到类型 List<String> 和类 ImmutableCollections$List1 之间确实存在差异。我们看到编译时类型的信息“更丰富”,其中编译器知道元素类型是 String,而在运行时元素类型信息由于类型擦除而丢失。

这里又一次演示了类型和类之间的区别

jshell> /set feedback verbose
|  Feedback mode: verbose

jshell> List.of("Hi", "Hello")
$1 ==> [Hi, Hello]
|  created scratch variable $1 : List<String>

jshell> List.of(42, -11)
$2 ==> [42, -11]
|  created scratch variable $2 : List<Integer>

jshell> $1.getClass() == $2.getClass()
$3 ==> true
|  created scratch variable $3 : boolean

注意表达式 List.of("Hi", "Hello")List.of(42, -11) 的类型是如何不同的,但对应的实例化对象的类是相同的。