Поскольку я новичок в Java, я запутался в понятиях класса и типа . Например, должен ли объект "Hello World!"
принадлежать к типу String
или классу String
? А может и то, и другое?
Поскольку я новичок в Java, я запутался в понятиях класса и типа . Например, должен ли объект "Hello World!"
принадлежать к типу String
или классу String
? А может и то, и другое?
Ответы:
Класс - это тип. Интерфейс - это тип. Примитив - это тип. Массив - это тип.
Следовательно, каждый тип также является либо классом (включая константу перечисления), либо интерфейсом, либо примитивом, либо массивом.
Есть две различные категории типов: примитивные типы и ссылочные типы:
Object
. Ссылочные типы - это типы классов (включая типы перечислений), типы интерфейсов и типы массивов.У каждой части данных есть тип, который определяет ее структуру, а именно, сколько памяти она занимает, как она размещена и, что более важно, как вы можете с ней взаимодействовать.
Примеры примитивных типов:
int
float
char
boolean
Примеры типов классов:
Примеры типов интерфейсов:
Примеры типов массивов:
int[]
String[]
Integer[][][]
По сути, все, что вы можете назвать переменной, имеет тип, а классы - это своего рода тип.
Подробнее здесь: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html
TL; DR - класс является одним из типов в Java.
Примечание. Чтобы полностью понять ответ, вы должны иметь некоторое представление о дженериках в Java.
Чтобы понять разницу, давайте сначала разберемся, что такое тип в Java.
Согласно JLS SE 10 ,
В языке программирования Java есть два типа типов : примитивные типы ( §4.2 ) и ссылочные типы (§4.3).
Что такое примитивный тип?
a) Целочисленные типы - это byte, short, int и long , значения которых представляют собой 8-битные, 16-битные, 32-битные и 64-битные целые числа с дополнением до двух со знаком, соответственно, и char, значения которых являются 16-битными. целые числа без знака, представляющие кодовые единицы UTF-16 (§3.1).
б) Типы с плавающей запятой - это float , значения которого включают 32-битные числа с плавающей запятой IEEE 754, и double , значения которого включают 64-битные числа с плавающей запятой IEEE 754.
c) Логический тип имеет ровно два значения: истина и ложь.
Теперь давайте перейдем к тому, что такое ссылочный тип?
Есть четыре вида ссылочных типов: типы класса ( §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
переменная типа, которую можно использовать в качестве справочной. Да, это так. (Не могу понять этот странный пример - узнайте, что такое универсальный метод в Java)
Это завершает ответ.
«Тип» - более инклюзивная категория. Переменные в Java могут иметь три типа: 8 «примитивных» типов, таких как int и float, интерфейсы и классы. Значения (в отличие от переменных) могут быть примитивными или экземплярами класса.
"Тип" определяет "какой это тип данных"
Пример: «hello world» - это String -> «hello world» - это String (String не является предварительными данными, в отличие от int .. поэтому мы можем сказать, что «hello world» - это строковый тип класса)
10 - это int -> 10 - это целочисленный тип данных.