刚接触Java,我对类和类型的概念感到困惑。
例如,对象"Hello World!"
是否属于类型 String
或类 String
?或者两者兼而有之?
答案 0 :(得分:115)
一个类是一种类型。接口是一种类型。原语是一种类型。数组是一种类型。
因此,每个类型也可以是一个类(包括枚举常量),接口,基元或数组。
有两种不同类型的类型:基本类型和引用类型:
Object
的方法。引用类型是类类型(包括枚举类型),接口类型和数组类型。 每个数据都有一个定义其结构的类型,即它占用了多少内存,如何布局,更重要的是,如何与它进行交互。
原始类型的示例:
int
float
char
boolean
班级类型的例子:
String
Integer
Boolean
ArrayList
StringBuilder
界面类型示例:
Collection
List
Map
Serializable
数组类型示例:
int[]
String[]
Integer[][][]
基本上,任何你可以称为变量的东西都有一个类型,而类是一种类型。
此处有更多信息: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 。
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。
现在,让我们看看什么是引用类型?
让我们一一讨论。
如果您在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)
的类型是如何不同的,但对应的实例化对象的类是相同的。