Różnica między klasą a typem


105

Będąc nowym w Javie, jestem zdezorientowany między koncepcjami klasy i typu . Na przykład, czy obiekt powinien "Hello World!"należeć do typu String czy klasy String ? A może jedno i drugie?


24
Ostatnio wydaje się, że istnieje skłonność do odrzucania wszelkich pytań w stylu „początkujących”, czy są dobre, czy nie. To co najmniej denerwujące.
nico_c

9
Również aby odrzucić każde pytanie, którego wyborca ​​nie rozumie ...
Markiz Lorne

4
Zgadzam się, że to trochę niegrzeczne, aby głosować przeciw, gdy mówisz pytania dla początkujących, ale niezależnie od tego, czy jest to dobre, czy złe, wszystkie pytania dla początkujących można znaleźć po prostu przeszukując sieć. Problem i powód, dla którego ludzie przegrywają, jest taki, że prowadzi to do przepełnienia stosu :)
Marko Lazić

13
To świetne pytanie - a 3 głosy do zamknięcia są powodem, dla którego musimy mieć możliwość głosowania, aby pozostać otwartym . Wciąż pamiętam, kiedy uczyłem się języka Java, że ​​żargon OO był największą przeszkodą.
Lawrence Dol

4
@nickecarlo W FAQ był kiedyś punkt, który wydaje się być usunięty w ciągu ostatniego roku - „pytanie wskazuje na poważny brak badań i nie wykazuje oznak wysiłku włożonego w rozwiązanie go przed zadaniem pytania ”. Uważam za irytujące, że jest mnóstwo bzdurnych pytań, które Google może rozwiązać, a nie ludzie tutaj, którzy tracą czas na wyjaśnianie innym „programowania 101”.
TC1

Odpowiedzi:


123

Klasa to typ. Interfejs to typ. Prymityw to typ. Tablica to typ.

Dlatego każdy typ jest również klasą (w tym stałą wyliczenia), interfejsem, elementem pierwotnym lub tablicą.

Istnieją dwie różne kategorie typów: typy pierwotne i typy referencyjne:

  • Zmienna typu pierwotnego zawsze zawiera wartość pierwotną tego samego typu. Taka wartość może zostać zmieniona tylko przez operacje przypisania tej zmiennej.
  • Zmienna typu referencyjnego zawsze zawiera wartość referencji do obiektu. Wszystkie obiekty, w tym tablice, obsługują metody klasy Object. Typy odwołań to typy klas (w tym typy wyliczeniowe), typy interfejsów i typy tablic.

Każdy element danych ma typ, który definiuje jego strukturę, a mianowicie, ile pamięci zajmuje, w jaki sposób jest rozplanowany, a co ważniejsze, w jaki sposób można z nim współdziałać.

Przykłady typów pierwotnych:

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

Przykłady typów klas:

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

Przykłady typów interfejsów:

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

Przykłady typów tablic:

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

Zasadniczo wszystko, do czego można się odnieść jako do zmiennej, ma typ, a klasy są rodzajem typu.

Więcej informacji tutaj: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html


6
Nie zapomnij o tablicach.
Paul Bellora

1
Nie uczyni edycję siebie, bo nie jestem pewien, że to, co masz na myśli pisać, ale może lepiej powiedzieć, że zajęcia są „rodzajem typu” zamiast „rodzajem typu”.
CVn

@ MichaelKjörling Tak, to lepszy sposób wyrażenia tego. Zaktualizuję to.
Brandon

3
Zapomniałeś typu null (patrz JLS 4.1).
user1803551

1
@AndyDong Klasa abstrakcyjna nadal jest klasą.
Brandon,

6

TLDR - klasa jest jednym z typów w Javie.

Uwaga - aby w pełni zrozumieć odpowiedź, musisz mieć trochę pojęcia o rodzajach generycznych w Javie.


Aby zrozumieć różnicę, najpierw zrozumiemy, czym jest typ w Javie.

Według JLS SE 10 ,

Istnieją dwa rodzaje typów w języku programowania Java: typy pierwotne ( §4.2 ) oraz typy referencyjne (§4.3).

Co to jest typ pierwotny?

a) Typy całkowite to bajt, short, int i long , których wartości to odpowiednio 8-bitowe, 16-bitowe, 32-bitowe i 64-bitowe liczby całkowite uzupełnione do dwóch ze znakiem oraz char, których wartości są 16-bitowe liczby całkowite bez znaku reprezentujące jednostki kodu UTF-16 (§3.1).

b) Typy zmiennoprzecinkowe to zmiennoprzecinkowe , których wartości obejmują 32-bitowe liczby zmiennoprzecinkowe IEEE 754 i double , których wartości obejmują 64-bitowe liczby zmiennoprzecinkowe IEEE 754.

c) Typ boolowski ma dokładnie dwie wartości: prawda i fałsz.

Przejdźmy teraz do tego, czym jest typ referencyjny?

Istnieją cztery rodzaje typów odwołań: typy klas ( pkt 8.1 ), typy interfejsów ( pkt 9.1 ), zmienne typu ( pkt 4.4 ) i typy tablicowe (pkt 10.1 ).

Omówmy jeden po drugim.

Jeśli widzisz, jak w JLS, klasa jest zdefiniowana w następujący sposób:

Deklaracja klasy określa nowy typ o nazwie odniesienia.

Istnieją dwa rodzaje deklaracji klas: normalne deklaracje klas i deklaracje wyliczeń .

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

Widzisz [TypeParameters], to pokazuje, że typ klasy obejmuje również te klasy ogólne.

class Example<T>{

}

Zostanie wywołany typ klasy Example

Krótko mówiąc, typ klasy obejmuje nasze wyliczenia, nasze zwykłe (nieogólne) klasy, takie jak String itp., A także nasze klasy ogólne.

Podobnie, mam nadzieję, że interfejs i typy tablic są również jasne. Według rodzaju tablicy mamy na myśli int[], String[]itd.

Przejdźmy do ostatniej części - Zmienne typu. Czym oni są ?

Zmienna typu to niekwalifikowany identyfikator używany jako typ w treściach klasy, interfejsu, metody i konstruktora.

Rozumiemy na przykładzie w JLS poniżej.

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

    } 
}

Widzisz, że twój obiekt w parametrze metody jest typu T. Tak, to Tjest zmienna typu i może służyć jako odniesienie. Tak to jest. (Nie mogłem zrozumieć tego dziwnego przykładu - Dowiedz się, co to jest metoda ogólna w Javie)

To kończy odpowiedź.


4

„Typ” to kategoria bardziej obejmująca. Zmienne w Javie mogą mieć trzy rodzaje typów: 8 typów „pierwotnych”, takich jak int i float, interfejsy i klasy. Wartości (w przeciwieństwie do zmiennych) mogą być prymitywami lub instancjami klas.


2

„Typ” określa „jaki to typ danych”

Na przykład: „hello world” to String -> „hello world” to typ String (String nie jest danymi wstępnymi w przeciwieństwie do int .. więc możemy powiedzieć, że „hello world” to typ typu string)

10 to liczba całkowita -> 10 to liczba całkowita.


5
Uważaj, używając liczb całkowitych do wyjaśnienia int, ponieważ Integer! = Int w Javie.
nico_c
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.