Разница между классом и типом


105

Поскольку я новичок в Java, я запутался в понятиях класса и типа . Например, должен ли объект "Hello World!"принадлежать к типу String или классу String ? А может и то, и другое?


24
В последнее время, кажется, есть склонность отрицать любые вопросы в стиле «новичок», хороши они или нет. Это, мягко говоря, раздражает.
nico_c

9
Также, чтобы проголосовать против любого вопроса, который избиратель не понимает ...
Маркиз Лорн

4
Я согласен, что это отчасти грубо отрицать, когда вы задаете вопросы для начинающих, но независимо от того, хорошо это или плохо, на все вопросы для начинающих есть ответы, просто поискав в Интернете. Проблема и причина, по которой люди голосуют против, в том, что это приводит к переполнению стека :)
Марко Лазич

13
Это отличный вопрос - и 3 голоса до закрытия - это то, почему мы должны иметь возможность голосовать, чтобы оставаться открытыми . Я до сих пор помню, когда изучал Java, жаргон объектно-ориентированного программирования был самым большим препятствием.
Лоуренс Дол

4
@nickecarlo Раньше в FAQ был пункт, который, кажется, убрали в течение последнего года или около того - "вопрос показывает серьезное отсутствие исследований и не показывает признаков усилий, предпринятых для его решения, прежде чем задать вопрос ". Меня раздражает, что есть ТОННА дерьмовых вопросов, которые Google может решить, вместо того, чтобы люди здесь тратят свое время, объясняя «программирование 101» другим.
TC1

Ответы:


123

Класс - это тип. Интерфейс - это тип. Примитив - это тип. Массив - это тип.

Следовательно, каждый тип также является либо классом (включая константу перечисления), либо интерфейсом, либо примитивом, либо массивом.

Есть две различные категории типов: примитивные типы и ссылочные типы:

  • Переменная примитивного типа всегда содержит примитивное значение того же типа. Такое значение можно изменить только с помощью операций присваивания этой переменной.
  • Переменная ссылочного типа всегда содержит значение ссылки на объект. Все объекты, включая массивы, поддерживают методы класса Object. Ссылочные типы - это типы классов (включая типы перечислений), типы интерфейсов и типы массивов.

У каждой части данных есть тип, который определяет ее структуру, а именно, сколько памяти она занимает, как она размещена и, что более важно, как вы можете с ней взаимодействовать.

Примеры примитивных типов:

  1. int
  2. float
  3. char
  4. boolean

Примеры типов классов:

  1. String
  2. Integer
  3. Boolean
  4. ArrayList
  5. StringBuilder

Примеры типов интерфейсов:

  1. Collection
  2. List
  3. Map
  4. Serializable

Примеры типов массивов:

  1. int[]
  2. String[]
  3. Integer[][][]

По сути, все, что вы можете назвать переменной, имеет тип, а классы - это своего рода тип.

Подробнее здесь: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html


6
Не забывайте о массивах.
Пол Беллора

1
Я не буду вносить изменения сам, потому что не уверен, что вы хотели написать, но, возможно, лучше будет сказать, что классы являются «разновидностью типа», а не «типом типа».
CVn

@ MichaelKjörling Да, это лучший способ сказать это. Я обновлю его.
Брэндон

3
Вы забыли нулевой тип (см. JLS 4.1).
user1803551

1
@AndyDong Абстрактный класс по-прежнему остается классом.
Брэндон

6

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)

Это завершает ответ.


4

«Тип» - более инклюзивная категория. Переменные в Java могут иметь три типа: 8 «примитивных» типов, таких как int и float, интерфейсы и классы. Значения (в отличие от переменных) могут быть примитивными или экземплярами класса.


2

"Тип" определяет "какой это тип данных"

Пример: «hello world» - это String -> «hello world» - это String (String не является предварительными данными, в отличие от int .. поэтому мы можем сказать, что «hello world» - это строковый тип класса)

10 - это int -> 10 - это целочисленный тип данных.


5
Будьте осторожны с использованием целого числа для объяснения int, поскольку Integer! = Int в Java.
nico_c
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.