คลาสออบเจ็กต์และอินสแตนซ์ใน Java คืออะไร?
คำตอบ:
Java (และการเขียนโปรแกรมภาษาอื่น ๆ ) เป็นแบบจำลองในแง่ของประเภทและค่า ในระดับทฤษฎีค่าคือการแสดงข้อมูลควอนตัมบางส่วนและประเภทคือชุดของค่า เมื่อเราพูดว่าค่า X เป็นอินสแตนซ์ของประเภท Y เราพูดง่ายๆว่า X เป็นสมาชิกของชุดค่าที่เป็นประเภท Y
นั่นคือความหมายจริงๆของคำว่า "อินสแตนซ์" มันอธิบายถึงความสัมพันธ์ไม่ใช่สิ่ง
ระบบประเภทของการเขียนโปรแกรมภาษา Java สนับสนุนสองชนิดของประเภทชนิดดั้งเดิมและประเภทของการอ้างอิง ประเภทการอ้างอิงจะแบ่งออกเป็นคลาสและประเภทอาร์เรย์เพิ่มเติม ออบเจ็กต์ Java เป็นอินสแตนซ์ของประเภทการอ้างอิง
ออบเจ็กต์คืออินสแตนซ์คลาสหรืออาร์เรย์ ( JLS 4.3.1 )
นั่นคือมุมมองแบบทฤษฎี
ในทางปฏิบัตินักพัฒนา Java ส่วนใหญ่ถือว่าคำว่า "instance" และ "object" เป็นคำพ้องความหมาย (และนั่นรวมถึงตัวฉันด้วยฉันกำลังพยายามอธิบายบางอย่างอย่างรวดเร็ว) และนักพัฒนาส่วนใหญ่ใช้คำว่า "ค่า" แทนที่จะเป็น "อินสแตนซ์" เพื่ออ้างถึงอินสแตนซ์ของประเภทดั้งเดิม
user2390183
คุณกำลังทำผิดพลาดเช่นเดียวกับ คุณกำลังปฏิบัติต่อตัวแปรเป็น "ชื่อ" พวกเขาจะไม่. ตัวแปรคือ "ตัวยึดอ้างอิง" ที่มีการอ้างอิงถึงวัตถุ ออบเจ็กต์ไม่มีชื่อที่แท้จริง การอ้างอิงเป็นสิ่งที่ใกล้เคียงที่สุดกับ "ชื่อ" สำหรับวัตถุยกเว้นว่าไม่มีการแทนค่าคงที่ (GC สามารถย้ายวัตถุซึ่งเปลี่ยนรูปแบบบิตที่ใช้แสดงการอ้างอิง)
ระดับเป็นพิมพ์เขียวที่คุณใช้ในการสร้างวัตถุ วัตถุคืออินสแตนซ์ของคลาสซึ่งเป็น 'สิ่งของ' ที่เป็นรูปธรรมที่คุณสร้างขึ้นโดยใช้คลาสเฉพาะ ดังนั้น 'วัตถุ' และ 'อินสแตนซ์' จึงเป็นสิ่งเดียวกัน แต่คำว่า 'อินสแตนซ์' บ่งบอกถึงความสัมพันธ์ของวัตถุกับคลาสของมัน
นี่เป็นเรื่องง่ายที่จะเข้าใจหากคุณดูตัวอย่าง House
ตัวอย่างเช่นสมมติว่าคุณมีชั้นเรียน House
บ้านของคุณเองเป็นวัตถุและเป็นตัวอย่างของการเรียน บ้านพี่สาวของคุณเป็นวัตถุอื่น (เช่นชั้นเรียนอื่นHouse
)
// Class House describes what a house is
class House {
// ...
}
// You can use class House to create objects (instances of class House)
House myHouse = new House();
House sistersHouse = new House();
ชั้นอธิบายแนวคิดของสิ่งที่บ้านเป็นและมีเฉพาะบ้านคอนกรีตซึ่งเป็นวัตถุและอินสแตนซ์ของคลาสHouse
House
หมายเหตุ: สิ่งนี้เหมือนกับใน Java ทุกประการกับภาษาการเขียนโปรแกรมเชิงวัตถุทั้งหมด
class House {
// blue print for House Objects
}
class Car {
// blue print for Instances of Class Car
}
House myHouse = House new();
Car myCar = Car new();
คลาสเป็นคำจำกัดความและมีรหัสของออบเจ็กต์ วัตถุคือตัวอย่างของการเรียน
เช่นถ้าคุณพูด
String word = new String();
คลาสคือคลาส String ซึ่งอธิบายถึงอ็อบเจ็กต์ (อินสแตนซ์) คำ
เมื่อมีการประกาศคลาสจะไม่มีการจัดสรรหน่วยความจำดังนั้นคลาสจึงเป็นเพียงเทมเพลต
เมื่อมีการประกาศอ็อบเจ็กต์ของคลาสหน่วยความจำจะถูกจัดสรร
static
ตัวแปรของคลาส (และสำหรับสิ่งอื่น ๆ ด้วยที่เกี่ยวข้องกับตัวตนประเภทของคลาสด้วย)
ฉันชอบคำอธิบายของเจสเปอร์ในแง่คนธรรมดา
โดยการยกตัวอย่างที่ไม่เหมาะสมจากคำตอบของเจสเปอร์
class House {
// blue print for House Objects
}
class Car {
// blue print for Instances of Class Car
}
House myHouse = new House();
Car myCar = new Car();
myHouse และ myCar เป็นวัตถุ
myHouse เป็นตัวอย่างของ House (เกี่ยวข้องกับ Object-myHouse กับ Class-House) myCar เป็นตัวอย่างของรถยนต์
ในระยะสั้น
"myHouse เป็นตัวอย่างของClass House" ซึ่งเหมือนกับการพูดว่า "myHouse is an Object of type House"
คลาสคือประเภทข้อมูลคุณใช้ประเภทนี้เพื่อสร้างวัตถุ
อินสแตนซ์เป็นตรรกะ แต่อ็อบเจ็กต์คือฟิสิคัลหมายถึงครอบครองหน่วยความจำบางส่วน
เราสามารถสร้างอินสแตนซ์สำหรับคลาสนามธรรมเช่นเดียวกับอินเทอร์เฟซ แต่เราไม่สามารถสร้าง
อ็อบเจกต์สำหรับสิ่งเหล่านั้นได้
ออบเจ็กต์คืออินสแตนซ์ของคลาสและอินสแตนซ์หมายถึงตัวแทนของคลาสเช่นอ็อบเจ็กต์
อินสแตนซ์หมายถึงการอ้างอิงของวัตถุ
ออบเจ็กต์ชี้ไปที่ที่อยู่หน่วยความจำของอินสแตนซ์นั้นจริงๆ
คุณไม่สามารถส่งผ่านอินสแตนซ์ข้ามเลเยอร์ได้ แต่คุณสามารถส่งผ่านวัตถุข้ามเลเยอร์ได้
คุณไม่สามารถจัดเก็บอินสแตนซ์ได้ แต่คุณสามารถจัดเก็บวัตถุได้
วัตถุเดียวสามารถมีได้มากกว่าหนึ่งอินสแตนซ์
อินสแตนซ์จะมีทั้งนิยามคลาสและนิยามอ็อบเจ็กต์โดยที่ในอ็อบเจ็กต์จะมีเฉพาะนิยามอ็อบเจ็กต์
ไวยากรณ์ของวัตถุ:
Classname var=new Classname();
แต่สำหรับการสร้างอินสแตนซ์จะส่งกลับเพียงตัวชี้ที่อ้างถึงวัตถุไวยากรณ์คือ:
Classname varname;
ใน java วัตถุจะถูกสร้างบนหน่วยความจำฮีป สิ่งเหล่านี้ต้องการการอ้างอิงเพื่อชี้และใช้ในแอปพลิเคชันของเรา การอ้างอิงมีตำแหน่งหน่วยความจำของวัตถุซึ่งเราสามารถใช้วัตถุในแอปพลิเคชันของเราได้ การอ้างอิงโดยย่อคือชื่อของตัวแปรที่เก็บที่อยู่ของอ็อบเจ็กต์ที่สร้างอินสแตนซ์บนตำแหน่งหน่วยความจำ
เป็นคำทั่วไปสำหรับinstance
object
FYI Object
เป็นคลาส
ตัวอย่างเช่น,
Class A{
}
A ref = new A();
สำหรับข้อมูลโค้ดด้านบน ref คือการอ้างอิงสำหรับอ็อบเจ็กต์ของคลาส A ที่สร้างบนฮีป
สุจริตฉันรู้สึกสบายใจมากขึ้นกับคำจำกัดความของบล็อกอัลเฟรด :
วัตถุ : วัตถุในโลกแห่งความจริงมี 2 ลักษณะสำคัญสถานะและพฤติกรรม มนุษย์มีสถานะ (ชื่ออายุ) และพฤติกรรม (วิ่งนอนหลับ) รถมีสถานะ (ความเร็วปัจจุบันเกียร์ปัจจุบัน) และพฤติกรรม (ใช้เบรคเปลี่ยนเกียร์) วัตถุซอฟต์แวร์มีแนวความคิดคล้ายกับวัตถุในโลกแห่งความจริง: วัตถุเหล่านี้ประกอบด้วยสถานะและพฤติกรรมที่เกี่ยวข้องเช่นกัน อ็อบเจ็กต์เก็บสถานะในฟิลด์และเปิดเผยพฤติกรรมของมันผ่านวิธีการ
คลาส : คือ "เทมเพลต" / "พิมพ์เขียว" ที่ใช้ในการสร้างวัตถุ โดยทั่วไปคลาสจะประกอบด้วยฟิลด์ฟิลด์สแตติกเมธอดวิธีการคงที่และคอนสตรัคเตอร์ ฟิลด์ใช้เพื่อเก็บสถานะของคลาส (เช่น: name of Student object) Method ใช้เพื่อแสดงพฤติกรรมของคลาส (เช่น: Student object จะยืนขึ้นได้อย่างไร) Constructor ใช้เพื่อสร้างอินสแตนซ์ใหม่ของคลาส
อินสแตนซ์ : อินสแตนซ์คือสำเนาเฉพาะของคลาสที่แสดงถึงออบเจ็กต์ เมื่อสร้างอินสแตนซ์ใหม่ของคลาส JVM จะจัดสรรห้องหน่วยความจำสำหรับอินสแตนซ์คลาสนั้น
ยกตัวอย่างถัดไป:
public class Person {
private int id;
private String name;
private int age;
public Person (int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (id != other.id)
return false;
return true;
}
public static void main(String[] args) {
//case 1
Person p1 = new Person(1, "Carlos", 20);
Person p2 = new Person(1, "Carlos", 20);
//case 2
Person p3 = new Person(2, "John", 15);
Person p4 = new Person(3, "Mary", 17);
}
}
สำหรับกรณีที่ 1 มีสองอินสแตนซ์ของคลาส Person แต่อินสแตนซ์ทั้งสองแทนอ็อบเจ็กต์เดียวกัน
สำหรับกรณีที่ 2 มีสองอินสแตนซ์ของคลาสบุคคล แต่แต่ละอินสแตนซ์แสดงถึงออบเจ็กต์ที่แตกต่างกัน
คลาสวัตถุและอินสแตนซ์จึงเป็นคนละสิ่งกัน วัตถุและอินสแตนซ์ไม่ใช่คำพ้องความหมายตามที่แนะนำในคำตอบที่เลือกเป็นคำตอบที่ถูกต้อง
หากคุณมีโปรแกรมที่สร้างโมเดลรถยนต์คุณมีคลาสสำหรับแสดงรถยนต์ดังนั้นใน Code คุณสามารถพูดได้ว่า:
Car someCar = new Car();
someCar ตอนนี้เป็นตัวอย่างของรถคลาส หากโปรแกรมถูกใช้ที่ร้านซ่อมและ someCar แสดงถึงรถของคุณในระบบของพวกเขาแสดงว่ารถของคุณเป็นวัตถุ
ดังนั้นรถยนต์เป็นชั้นที่สามารถเป็นตัวแทนใด ๆ someCar โลกรถยนต์จริงเป็นตัวอย่างของการเรียนรถยนต์และ someCare หมายถึงหนึ่งวัตถุชีวิตจริง (รถของคุณ)
อย่างไรก็ตามอินสแตนซ์และอ็อบเจ็กต์มักใช้แทนกันได้เมื่อพูดถึงการเข้ารหัส
someCar
คือการอ้างอิงถึงอินสแตนซ์รถยนต์ อินสแตนซ์เองไม่มีชื่อ
ข้อมูลประเภทใด ๆ ที่คอมพิวเตอร์ของคุณจัดเก็บและประมวลผลอยู่ในการแสดงข้อมูลพื้นฐานที่สุดในแถวของบิต วิธีตีความบิตเหล่านั้นทำผ่านชนิดข้อมูล ชนิดข้อมูลอาจเป็นแบบดั้งเดิมหรือซับซ้อน ประเภทข้อมูลดั้งเดิม ได้แก่ - เช่น int หรือ double พวกเขามีความยาวที่เฉพาะเจาะจงและวิธีการตีความเฉพาะ ในกรณีของจำนวนเต็มโดยปกติบิตแรกจะใช้สำหรับเครื่องหมายส่วนอื่น ๆ จะใช้สำหรับค่า
ประเภทข้อมูลที่ซับซ้อนสามารถรวมกันของชนิดข้อมูลดั้งเดิมและชนิดข้อมูลที่ซับซ้อนอื่น ๆ และเรียกว่า "คลาส" ใน Java
คุณสามารถกำหนดประเภทข้อมูลที่ซับซ้อน PeopleName ซึ่งประกอบด้วยสองสตริงที่เรียกว่าชื่อและนามสกุล แต่ละ String ใน Java เป็นข้อมูลประเภทอื่นที่ซับซ้อน สตริงในทางกลับกัน (อาจ) นำไปใช้โดยใช้ถ่านชนิดข้อมูลดั้งเดิมซึ่ง Java รู้จำนวนบิตที่ใช้ในการจัดเก็บและวิธีการตีความ
เมื่อคุณสร้างอินสแตนซ์ของชนิดข้อมูลคุณจะได้รับอ็อบเจ็กต์และคอมพิวเตอร์ของคุณสงวนหน่วยความจำไว้และจดจำตำแหน่งและชื่อของอินสแตนซ์นั้น อินสแตนซ์ของ PeopleName ในหน่วยความจำจะใช้พื้นที่ของตัวแปร String สองตัวบวกอีกเล็กน้อยสำหรับการทำบัญชี จำนวนเต็มใช้เวลาถึง 32 บิตใน Java
ชนิดข้อมูลที่ซับซ้อนอาจมีวิธีการที่กำหนดให้ เมธอดสามารถดำเนินการกับอาร์กิวเมนต์หรือบนอินสแตนซ์ของชนิดข้อมูลที่คุณเรียกใช้เมธอดนี้ หากคุณมี PeopleName สองอินสแตนซ์ที่เรียกว่า p1 และ p2 และคุณเรียกเมธอด p1.getFirstName () โดยปกติจะส่งคืนชื่อของบุคคลแรก แต่ไม่ใช่ของบุคคลที่สอง
แนวคิดเบื้องหลังคลาสและอ็อบเจ็กต์คือการห่อหุ้มลอจิกไว้ในหน่วยการเขียนโปรแกรมเดียว คลาสคือพิมพ์เขียวของวัตถุที่สร้างขึ้น
นี่คือตัวอย่างของคลาสที่แสดงถึงรถยนต์:
public class Car {
int currentSpeed;
String name;
public void accelerate() {
}
public void park() {
}
public void printCurrentSpeed() {
}
}
คุณสามารถสร้างอินสแตนซ์ของObject Car ได้ดังนี้:
Car audi = new Car();
Car toyota = new Car();
ฉันได้นำตัวอย่างจากบทช่วยสอนนี้
ชั้น : โครงสร้าง
วัตถุ : การสำแดงทางกายภาพ
อินสแตนซ์ : แต่ละออบเจ็กต์ที่สร้างจากคลาส
อ้างอิง : ที่อยู่ของวัตถุ
มีการดำรงอยู่เชิงตรรกะกล่าวคือไม่มีการจัดสรรพื้นที่หน่วยความจำเมื่อสร้างขึ้น
มันคือชุดของวัตถุ
คลาสอาจถือได้ว่าเป็นพิมพ์เขียวในการสร้างวัตถุ
มันถูกสร้างขึ้นโดยใช้คีย์เวิร์ดระดับ
คลาสกำหนดวิธีการและสมาชิกข้อมูลที่จะถูกครอบครองโดย Objects
มีการดำรงอยู่ทางกายภาพกล่าวคือพื้นที่หน่วยความจำจะถูกจัดสรรเมื่อถูกสร้างขึ้น
มันเป็นตัวอย่างของคลาส
ออบเจ็กต์เป็นเอนทิตีเฉพาะซึ่งประกอบด้วยสมาชิกข้อมูลและฟังก์ชันสมาชิกร่วมกันในภาษา OOP
สร้างขึ้นโดยใช้คำหลักใหม่
ออบเจ็กต์ระบุการนำเมธอดไปใช้และค่าที่สมาชิกข้อมูลในคลาสจะถูกครอบครอง
คลาสคือพิมพ์เขียวที่จำเป็นในการสร้างวัตถุ (= อินสแตนซ์)
ความแตกต่างระหว่างวัตถุและอินสแตนซ์คือวัตถุคือสิ่งของและอินสแตนซ์เป็นความสัมพันธ์
กล่าวอีกนัยหนึ่งอินสแตนซ์อธิบายความสัมพันธ์ของวัตถุกับคลาสที่วัตถุนั้นสร้างขึ้น
คำจำกัดความ "Object is an instance of a class" ผิดแนวคิด แต่ถูกต้องตามการนำไปใช้งาน จริงๆแล้วคุณสมบัติเชิงวัตถุนั้นนำมาจากชีวิตจริงเพื่อมุ่งเน้นความคิดของโปรแกรมเมอร์จากมากไปน้อย ในชั้นเรียนชีวิตจริงได้รับการออกแบบมาเพื่อจัดการกับวัตถุเช่น - มนุษย์เรามีวรรณะศาสนาสัญชาติและอื่น ๆ อีกมากมาย วรรณะศาสนาสัญชาติเหล่านี้เป็นชนชั้นและไม่มีการดำรงอยู่โดยไม่มีมนุษย์ แต่ในการนำไปใช้งานจะไม่มีการดำรงอยู่ของวัตถุที่ไม่มีคลาส Object- Object เป็นเอนทิตีที่ไม่ต่อเนื่องซึ่งมีแอตทริบิวต์ที่กำหนดไว้อย่างดี ในที่นี้ไม่ต่อเนื่องหมายถึงสิ่งที่ทำให้แตกต่างจากที่อื่น แอตทริบิวต์ที่กำหนดไว้อย่างดีมีความหมายในบางบริบท Class- การจำแนกประเภทของวัตถุที่มีพฤติกรรมร่วมกันหรือวัตถุบางประเภททั่วไป
แม้ว่าคำตอบข้างต้นจะถูกต้อง แต่อีกวิธีหนึ่งในการคิดเกี่ยวกับคลาสและออบเจ็กต์ก็คือการใช้ตัวอย่างในโลกแห่งความเป็นจริงคลาสที่ชื่อสัตว์อาจมีสิ่งของเช่นแมวสุนัขหรือปลา วัตถุที่มีชื่อของพระคัมภีร์จะเป็นหนังสือชั้นเรียนเป็นต้นชั้นเรียนทั่วไปวัตถุมีความเฉพาะเจาะจง ตัวอย่างความคิดนี้ช่วยฉันเมื่อฉันเรียนภาษา Java
Animal
เป็นชั้นเรียนและCat
เป็นตัวอย่างแมวเหมียว "ปุย" ของฉันคืออะไร?
Animal
หมายถึงชุดของสัตว์ทั้งหมดและCat
หมายถึงชุดของแมวทั้งหมด Cat
เป็นส่วนหนึ่งของไม่ได้ตัวอย่างของAnimal
Animal
คลาสคือเทมเพลตหรือประเภท วัตถุเป็นตัวอย่างของคลาส
ตัวอย่างเช่น:
public class Tweet {
}
Tweet newTweet = new Tweet();
ทวีตเป็นคลาสและ newTweet เป็นวัตถุของคลาส