ความแตกต่างระหว่างคลาสและประเภท


105

เป็นใหม่เพื่อ Java ฉันสับสนระหว่างแนวคิดของระดับและประเภท ตัวอย่างเช่นวัตถุควร"Hello World!"อยู่ในประเภท Stringหรือคลาส Stringหรือไม่? หรืออาจจะทั้งสองอย่าง?


24
เมื่อเร็ว ๆ นี้ดูเหมือนว่าจะมีความโน้มเอียงที่จะลงคะแนนคำถามเกี่ยวกับสไตล์ "มือใหม่" ว่าดีหรือไม่ มันน่ารำคาญพูดน้อย
nico_c

9
นอกจากนี้เพื่อลงคะแนนคำถามที่ผู้มีสิทธิเลือกตั้งไม่เข้าใจ ...
Marquis of Lorne

4
ฉันยอมรับว่ามันเป็นเรื่องหยาบคายที่จะลงคะแนนเมื่อคุณพูดคำถามเริ่มต้น แต่ไม่ว่าจะดีหรือไม่ดีคำถามสำหรับผู้เริ่มต้นทั้งหมดมีคำตอบเพียงแค่ค้นหาเว็บ ปัญหาและสาเหตุที่ผู้คนลงคะแนนเป็นเพราะสิ่งนี้นำไปสู่สแต็กล้น :)
Marko Lazić

13
นี่เป็นคำถามที่ยอดเยี่ยมและการปิดโหวต 3 ครั้งคือเหตุผลที่เราต้องสามารถโหวตเพื่อให้เปิดต่อไป ฉันยังจำได้ว่าตอนที่ฉันเรียน Java ว่าศัพท์แสง OO เป็นอุปสรรคที่ใหญ่ที่สุด
Lawrence Dol

4
@nickecarlo เคยมีประเด็นหนึ่งในคำถามที่พบบ่อยซึ่งดูเหมือนว่าจะถูกนำออกไปในช่วงปีที่แล้ว - "คำถามนี้แสดงให้เห็นถึงการขาดการวิจัยอย่างจริงจังและไม่ได้แสดงสัญญาณของความพยายามที่จะแก้ไขก่อนที่จะถามคำถาม ". ฉันคิดว่ามันน่ารำคาญที่มีคำถามไร้สาระมากมายที่ Google สามารถแก้ปัญหาได้แทนที่จะเสียเวลาไปกับการอธิบาย "การเขียนโปรแกรม 101" ให้คนอื่นฟัง
TC1

คำตอบ:


123

คลาสคือประเภท อินเทอร์เฟซเป็นประเภทหนึ่ง ดึกดำบรรพ์เป็นประเภทหนึ่ง อาร์เรย์คือประเภท

ดังนั้นทุกประเภทยังเป็นคลาส (รวมถึงค่าคงที่ enum) อินเทอร์เฟซแบบดั้งเดิมหรืออาร์เรย์

มีสองประเภทที่แตกต่างกันประเภทดั้งเดิมและประเภทอ้างอิง:

  • ตัวแปรชนิดดั้งเดิมจะมีค่าดั้งเดิมของประเภทเดียวกันเสมอ ค่าดังกล่าวสามารถเปลี่ยนแปลงได้โดยการดำเนินการกำหนดตัวแปรนั้นเท่านั้น
  • ตัวแปรประเภทการอ้างอิงจะเก็บค่าของการอ้างอิงไปยังวัตถุเสมอ Objectวัตถุทั้งหมดรวมทั้งอาร์เรย์สนับสนุนวิธีการของการเรียน ประเภทการอ้างอิงคือประเภทคลาส (รวมถึงประเภท enum) ประเภทอินเทอร์เฟซและประเภทอาร์เรย์

ข้อมูลทุกชิ้นมีประเภทที่กำหนดโครงสร้าง ได้แก่ จำนวนหน่วยความจำที่ต้องใช้จัดวางอย่างไรและที่สำคัญกว่านั้นคือคุณจะโต้ตอบกับมันได้อย่างไร

ตัวอย่างของประเภทดั้งเดิม:

  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
อย่าลืมอาร์เรย์
Paul Bellora

1
ฉันจะไม่ทำการแก้ไขด้วยตัวเองเพราะฉันไม่แน่ใจว่านั่นคือสิ่งที่คุณตั้งใจจะเขียน แต่มันอาจจะได้ผลดีกว่าเมื่อบอกว่าชั้นเรียนเป็น "ประเภทหนึ่ง" มากกว่า "ประเภทของประเภท"
ผู้ใช้

@ MichaelKjörlingใช่นั่นเป็นวิธีที่ดีกว่าในการพูด ฉันจะอัปเดตให้
Brandon

3
คุณลืมประเภท null (ดู JLS 4.1)
user1803551

1
@AndyDong คลาสนามธรรมยังคงเป็นคลาส
Brandon

6

TLDR - Class เป็นหนึ่งใน Type ใน Java

หมายเหตุ - เพื่อให้เข้าใจคำตอบอย่างสมบูรณ์คุณต้องมีความคิดเล็กน้อยเกี่ยวกับ generics ใน Java


เพื่อให้เข้าใจถึงความแตกต่างให้เราเข้าใจก่อนว่าTypeคืออะไรใน Java

ตามJLS SE 10 ,

ภาษาโปรแกรม Java มีสองประเภทได้แก่ ประเภทดั้งเดิม ( §4.2 ) และประเภทอ้างอิง (§4.3)

ประเภทดั้งเดิมคืออะไร?

ก) ประเภทอินทิกรัลคือไบต์สั้น int และยาวซึ่งมีค่าคือ 8 บิต 16 บิต 32 บิตและ 64 บิตที่เซ็นชื่อสองจำนวนเต็มเสริมตามลำดับและถ่านซึ่งมีค่า 16 บิต จำนวนเต็มไม่ได้ลงนามแทนหน่วยรหัส UTF-16 (§3.1)

ข) ประเภทจุดลอยตัวมีลอยที่มีค่ารวม 32 บิตอีอีอี 754 จำนวนจุดลอยตัวและคู่ที่มีค่ารวม 64 บิตอีอีอี 754 จำนวนจุดลอยตัว

c) ประเภทบูลีนมีสองค่า: จริงและเท็จ

ตอนนี้ให้เรามาที่ประเภทอ้างอิงคืออะไร?

ประเภทอ้างอิงมีสี่ประเภท ได้แก่ ประเภทคลาส ( §8.1 ) ประเภทอินเทอร์เฟซ ( §9.1 ) ตัวแปรประเภท ( §4.4 ) และประเภทอาร์เรย์ ( §10.1 )

ให้เราคุยกันทีละคน

หากคุณเห็นว่าใน JLS คลาสถูกกำหนดไว้เช่นนี้:

การประกาศคลาสระบุชนิดการอ้างอิงที่ตั้งชื่อใหม่

มีสองชนิดของการประกาศระดับคือ: การประกาศระดับปกติและประกาศ enum

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

คุณจะเห็นว่า[TypeParameters]สิ่งนี้แสดงให้เห็นว่าประเภทชั้นเรียนรวมถึงคลาสทั่วไปเหล่านั้นด้วย

class Example<T>{

}

ประเภทคลาสจะถูกเรียก Example

กล่าวโดยย่อคือประเภทคลาสจะครอบคลุม enums ของเราคลาสปกติ (ไม่ใช่คลาสทั่วไป) Stringของเราเช่นetc และคลาสทั่วไปของเราด้วย

ในทำนองเดียวกันฉันหวังว่าอินเทอร์เฟซและประเภทอาร์เรย์จะชัดเจนเช่นกัน ตามประเภทอาร์เรย์เราหมายถึงชอบint[], String[]ฯลฯ

ให้เรามาที่ส่วนสุดท้าย - ประเภทตัวแปร พวกเขาคืออะไร?

ตัวแปร type คือตัวระบุที่ไม่มีเงื่อนไขที่ใช้เป็นประเภทในคลาสอินเตอร์เฟสเมธอดและคอนสตรัคเตอร์

ให้เราเข้าใจตามตัวอย่างใน 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คือตัวแปร Type และสามารถใช้เป็นข้อมูลอ้างอิงได้ ใช่แล้ว. (ไม่เข้าใจตัวอย่างแปลก ๆ นี้ - เรียนรู้วิธีการทั่วไปใน Java คืออะไร)

คำตอบนี้เสร็จสมบูรณ์


4

"ประเภท" คือหมวดหมู่ที่รวมมากกว่า ตัวแปรใน Java สามารถมีได้ 3 ประเภท ได้แก่ ประเภท "ดั้งเดิม" 8 ประเภทเช่น int และ float อินเทอร์เฟซและคลาส ค่า (ตรงข้ามกับตัวแปร) อาจเป็นอินสแตนซ์ดั้งเดิมหรือคลาส


2

"ประเภท" กำหนด "ประเภทของข้อมูล"

เช่น "hello world" เป็น String -> "hello world" เป็นประเภท String (String ไม่ใช่ข้อมูล premetive ซึ่งแตกต่างจาก int .. ดังนั้นเราจึงสามารถพูดว่า "hello world" เป็นประเภทคลาสสตริง)

10 คือ int -> 10 เป็นชนิดข้อมูลจำนวนเต็ม


5
ระวังการใช้จำนวนเต็มเพื่ออธิบาย int เนื่องจาก Integer! = int ใน Java
nico_c

0

นี่เป็นคำถามเกี่ยวกับคำศัพท์เกี่ยวกับการเขียนโปรแกรมและตามที่คาดไว้ยังมีอีกคำตอบหนึ่งที่ถือว่าถูกต้อง

ระบบประเภท Java ตามที่เปิดเผยโดย API การสะท้อนมีสองประเภท: Class<T>คลาสและTypeอินเทอร์เฟซซึ่งใช้ในอดีต ในระบบนี้ชั้น (องค์ประกอบที่อธิบายไว้โดยตัวอย่างของClass<T>) เป็นชนิดใด ๆ ที่สร้างขึ้นด้วยคำหลักclassหรือinterfaceชนิดดั้งเดิมใด ๆ อาร์เรย์ใด ๆ voidดังกล่าวและ อย่างอื่นเป็นเพียงType.

แล้วอย่างอื่นคืออะไร? แม้ว่าคลาสในบริบทนี้จะเป็นทุกสิ่งที่รันไทม์มองเห็นและเข้าถึงได้เมื่อพิจารณาถึงความสามารถของอ็อบเจ็กต์ แต่โดยทั่วไปแล้วประเภทคือทุกสิ่งที่คอมไพเลอร์เห็น นี้อาจจะเป็นประเภท parametrized (ชอบArrayList<String>- จำไว้ว่าลบออกประเภททำให้เกิดทุกArrayList<T>การแมปไปชั้นเดียวกันที่รันไทม์) ซึ่งเป็นพารามิเตอร์ประเภททั่วไปที่สร้างขึ้นเป็นส่วนหนึ่งของวิธีการหรือชั้นเรียนการประกาศเป็นประเภทสัญลักษณ์แทนและใด ๆอาร์เรย์นั้น ประเภทเหล่านี้ถูกเปิดเผยโดยวิธี API ในทุกที่ที่การลบประเภทไม่มีผลเช่นเมื่อข้ามผ่านประเภทพารามิเตอร์หรือประเภทฐาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.