Sự khác biệt giữa lớp và loại


105

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ớpkiể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?


24
Gần đây, dường như có xu hướng từ chối bất kỳ câu hỏi kiểu "người mới bắt đầu" nào cho dù chúng có tốt hay không. Nó khó chịu, để nói rằng ít nhất.
nico_c

9
Ngoài ra để phản đối bất kỳ câu hỏi nào mà người bỏ phiếu không hiểu ...
Marquis of Lorne

4
Tôi đồng ý rằng việc từ chối khi bạn nói những câu hỏi dành cho người mới bắt đầu là hơi thô lỗ, nhưng dù tốt hay xấu, tất cả các câu hỏi dành cho người mới bắt đầu đều có câu trả lời chỉ bằng cách tìm kiếm trên web. Vấn đề và lý do mọi người phản đối là vì điều này dẫn đến tràn ngăn xếp :)
Marko Lazić

13
Đây là một câu hỏi tuyệt vời - và 3 phiếu bầu để đóng là lý do tại sao chúng ta cần có thể bỏ phiếu để tiếp tục bỏ phiếu . Tôi vẫn nhớ khi tôi học Java rằng biệt ngữ OO là trở ngại lớn nhất.
Lawrence Dol

4
@nickecarlo Đã từng có một điểm trong Câu hỏi thường gặp, dường như đã được đưa ra trong khoảng năm ngoái - "câu hỏi cho thấy sự thiếu nghiên cứu nghiêm trọng và không có dấu hiệu nỗ lực để giải quyết trước khi đặt câu hỏi ". Tôi thấy thật khó chịu khi có HÀNG TẤN câu hỏi nhảm nhí mà Google có thể giải quyết thay vì những người ở đây thực sự lãng phí thời gian giải thích "lập trình 101" cho người khác.
TC1

Câu trả lời:


123

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:

  • Một biến của kiểu nguyên thủy luôn giữ một giá trị nguyên thủy của cùng kiểu đó. Giá trị như vậy chỉ có thể được thay đổi bằng các thao tác gán trên biến đó.
  • Một biến kiểu tham chiếu luôn giữ giá trị của một tham chiếu đến một đối tượng. Tất cả các đối tượng, bao gồm cả mảng, hỗ trợ các phương thức của lớp 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:

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

Ví dụ về các loại lớp:

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

Ví dụ về các loại giao diện:

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

Ví dụ về kiểu mảng:

  1. int[]
  2. String[]
  3. 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


6
Đừng quên các mảng.
Paul Bellora

1
Tôi sẽ không tự mình chỉnh sửa vì tôi không chắc đó là những gì bạn muốn viết, nhưng có thể hiệu quả hơn khi nói rằng các lớp là "một loại của một loại" hơn là "một loại một loại".
CVn

@ MichaelKjörling Vâng, đó là một cách nói hay hơn. Tôi sẽ cập nhật nó.
Brandon

3
Bạn quên kiểu null (xem JLS 4.1).
user1803551

1
@AndyDong Một lớp trừu tượng vẫn là một lớp.
Brandon

6

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ư Stringvv 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 Tlà 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.


4

"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.


2

"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.


5
Hãy cẩn thận với việc sử dụng số nguyên để giải thích một int vì Integer! = Int trong Java.
nico_c
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.