Là người mới làm quen với Java, tôi bối rối giữa các khái niệm về lớp và kiểu . Ví dụ, đối tượng nên "Hello World!"
thuộc kiểu String
hay lớp String
? Hoặc có thể là cả hai?
Là người mới làm quen với Java, tôi bối rối giữa các khái niệm về lớp và kiểu . Ví dụ, đối tượng nên "Hello World!"
thuộc kiểu String
hay lớp String
? Hoặc có thể là cả hai?
Câu trả lời:
Một lớp là một kiểu. Giao diện là một loại. Nguyên thủy là một loại. Mảng là một kiểu.
Do đó, mọi kiểu cũng là một lớp (bao gồm một hằng số enum), một giao diện, một nguyên thủy hoặc một mảng.
Có hai danh mục riêng biệt của các loại: loại nguyên thủy và loại tham chiếu:
Object
. Các kiểu tham chiếu là kiểu lớp (bao gồm kiểu enum), kiểu giao diện và kiểu mảng.Mỗi phần dữ liệu có một kiểu xác định cấu trúc của nó, cụ thể là nó chiếm bao nhiêu bộ nhớ, cách bố trí và quan trọng hơn, bạn có thể tương tác với nó như thế nào.
Ví dụ về các kiểu nguyên thủy:
int
float
char
boolean
Ví dụ về các loại lớp:
Ví dụ về các loại giao diện:
Ví dụ về kiểu mảng:
int[]
String[]
Integer[][][]
Về cơ bản, bất cứ thứ gì bạn có thể tham chiếu đến như một biến đều có một kiểu và các lớp là một kiểu một kiểu.
Thông tin thêm tại đây: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html
TLDR - Lớp là một trong những Kiểu trong Java.
Lưu ý - Để hiểu đầy đủ câu trả lời, bạn phải có một chút ý tưởng về generic trong Java.
Để hiểu sự khác biệt, trước tiên chúng ta hãy hiểu Type là gì trong Java.
Theo JLS SE 10 ,
Có hai loại kiểu trong ngôn ngữ lập trình Java: kiểu nguyên thủy ( §4.2 ) và kiểu tham chiếu (§4.3).
Loại nguyên thủy là gì?
a) Các kiểu tích phân là byte, short, int và long , có giá trị là 8-bit, 16-bit, 32-bit và 64-bit, tương ứng có dấu hai số nguyên bổ sung và ký tự char, có giá trị là 16-bit số nguyên không dấu đại diện cho các đơn vị mã UTF-16 (§3.1).
b) Các kiểu dấu phẩy động là float , có giá trị bao gồm số dấu phẩy động IEEE 754 32 bit và double , có giá trị bao gồm số dấu phẩy động IEEE 754 64 bit.
c) Kiểu boolean có đúng hai giá trị: true và false.
Bây giờ, chúng ta hãy đến với kiểu tham chiếu là gì?
Có bốn loại kiểu tham chiếu: kiểu lớp ( §8.1 ), kiểu giao diện ( §9.1 ), biến kiểu ( §4.4 ) và kiểu mảng ( §10.1 ).
Hãy để chúng tôi thảo luận từng người một.
Nếu bạn thấy cách trong JLS, Lớp được định nghĩa như thế này:
Một khai báo lớp chỉ định một kiểu tham chiếu được đặt tên mới.
Có hai loại khai báo lớp: khai báo lớp bình thường và khai báo enum .
ClassDeclaration:
NormalClassDeclaration
EnumDeclaration
NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody
Bạn thấy rằng [TypeParameters]
, điều này cho thấy rằng loại lớp cũng bao gồm các lớp chung đó.
class Example<T>{
}
Loại lớp sẽ được gọi là Example
Nói tóm lại, một loại lớp bao gồm các enum của chúng ta, các lớp thông thường (không chung chung) như String
vv và các lớp chung của chúng ta nữa.
Tương tự, tôi hy vọng giao diện và kiểu mảng cũng rõ ràng. Theo kiểu mảng, chúng tôi có nghĩa là như int[]
, String[]
v.v.
Chúng ta hãy đến với phần cuối cùng - Loại biến. Họ là ai ?
Biến kiểu là một định danh không đủ tiêu chuẩn được sử dụng như một kiểu trong các phần tử lớp, giao diện, phương thức và phương thức khởi tạo.
Hãy để chúng tôi hiểu bằng ví dụ trong JLS bên dưới nó.
class Test {
<T extends C & I> void test(T t) {
t.mI(); // OK
t.mCPublic(); // OK
t.mCProtected(); // OK
t.mCPackage(); // OK
}
}
Bạn thấy rằng đối tượng của bạn trong tham số phương thức là loại T
. Có, đây T
là biến Kiểu và được / có thể được sử dụng làm tham chiếu. Vâng, đúng vậy. (Không thể hiểu được ví dụ kỳ lạ này - Tìm hiểu phương thức chung trong Java là gì)
Điều này hoàn thành câu trả lời.
"Loại" là danh mục bao hàm hơn. Các biến trong Java có thể có ba kiểu: 8 kiểu "nguyên thủy" như int và float, giao diện và lớp. Giá trị (trái ngược với biến) có thể là cá thể nguyên thủy hoặc lớp.
"Loại" xác định 'loại dữ liệu đó là'
Ví dụ: "hello world" là một Chuỗi -> "hello world" là kiểu Chuỗi (Chuỗi không phải là dữ liệu tiền tố không giống như int .. vì vậy chúng ta có thể nói "hello world" là một kiểu lớp chuỗi)
10 là kiểu int -> 10 là kiểu dữ liệu số nguyên.