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?
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?
Odpowiedzi:
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:
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:
int
float
char
boolean
Przykłady typów klas:
Przykłady typów interfejsów:
Przykłady typów tablic:
int[]
String[]
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
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 T
jest 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ź.
„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.
„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.