Різниця між класом і типом


105

Будучи новим у Java, я плутаюся між поняттями класу та типу . Наприклад, чи повинен "Hello World!"належати об'єкт типу String чи класу String ? А може, і те й інше?


24
Останнім часом, здається, є схильність спростовувати будь-які запитання у стилі «початківець», хороші вони чи ні. Це, найменше, дратує.
nico_c

9
Також спростуйте будь-яке питання, яке виборця не розуміють ...
Маркіз Лорнський

4
Я погоджуюсь, що це неначе грубо спростувати, як ви говорите на запитання для початківців, але чи це добре, чи погано, на всі питання для початківців є свої відповіді лише пошук в Інтернеті. Проблема і причина, по якій люди звертаються з прихильністю, полягає в тому, що це призводить до переповнення стека :)
Marko Lazić

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).
користувач1803551

1
@AndyDong Абстрактний клас все ще є класом.
Брендон

6

TLDR - Клас - один із типів у Java.

Примітка. Щоб повністю зрозуміти відповідь, ви повинні мати трохи уявлення про генеричні засоби на Java.


Щоб зрозуміти різницю, давайте спочатку розберемося, що таке тип у Java.

Відповідно до JLS SE 10 ,

У мові програмування Java існує два типи : примітивні типи ( §4.2 ) та типи посилань (§4.3).

Що таке примітивний тип?

а) Інтегральними типами є байт, короткий, int та довгий , значеннями яких є 8-бітні, 16-бітні, 32-розрядні та 64-бітні цілі цілі числа комплементу відповідно та char, значення яких 16-бітні непідписані цілі числа, що представляють кодові одиниці UTF-16 (§3.1).

б) типи з плаваючою точкою з плаваючою точкою , значення яких включають в себе 32-розрядні IEEE 754 числа з плаваючою точкою, і двічі , значення яких включають в себе 64-розрядні IEEE 754 числа з плаваючою крапкою.

в) Булевий тип має рівно два значення: істинне і хибне.

Тепер давайте підійдемо до того, що є еталонним типом?

Існує чотири типи посилальних типів: типи класів ( §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" - це рядок -> "hello world" - це тип String (String - це не попереджувальна інформація на відміну від int .. тому ми можемо сказати, що "hello world" - це тип класу string)

10 - int -> 10 - цілий тип даних.


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