อะไรคือวิธีที่แตกต่างในการสร้างวัตถุใน Java?


178

มีการสนทนากับเพื่อนร่วมงานเมื่อวันก่อนเกี่ยวกับเรื่องนี้

มีความชัดเจนในการใช้คอนสตรัคเตอร์ แต่มีวิธีอื่นอีกบ้าง?


2
เมื่อสงสัยให้ดูที่สเป็คภาษา 12.5 การสร้างอินสแตนซ์ของคลาสใหม่java.sun.com/docs/books/jls/third_edition/html/… 15.9 นิพจน์อินสแตนซ์ของการสร้างคลาสอินสแตนซ์java.sun.com/docs/books/jls/third_edition/html/ …
เพื่อนทางอินเทอร์เน็ต

9
มี 3 เท่านั้น: ปกติ C-Tor (คำหลักใหม่) โคลน () Unsafe.allocateInstance(Class)และ ที่เหลือเรียกหนึ่งในนั้น Reflection ถูกคอมไพล์ไปยังการเรียกแบบ c-tor, การดีซีเรียลไลซ์เซชั่นเป็น Unsafe.allocateInstance (Class) คุณสามารถสร้าง API ของคุณเองและคุณจะเรียกหนึ่งในนั้น
bestsss

2
@ bestsss- Unsafeเป็นรายละเอียดเฉพาะของการนำไปปฏิบัติของ Java และไม่ได้กล่าวถึงในที่ใด ๆ มันเป็นไปได้ทั้งหมดในการสร้างการใช้ Java ตามมาตรฐานที่ไม่ได้ใช้การสะท้อนลงรวบรวมรหัสที่ใช้new, หรือclone Unsafe.allocateInstance
templatetypedef

2
คุณสามารถตรวจสอบลิงค์, codesandlogics.com/2017/01/ways-to-create-objects-in-java.html
Pragya

คำตอบ:


288

มีสี่วิธีในการสร้างวัตถุใน java:

. การใช้newคำสำคัญ
นี่เป็นวิธีที่พบได้บ่อยที่สุดในการสร้างวัตถุในจาวา วัตถุเกือบ 99% ถูกสร้างขึ้นด้วยวิธีนี้

 MyObject object = new MyObject();

. ใช้Class.forName()
ถ้าเรารู้ชื่อของคลาส & ถ้ามันมีตัวสร้างค่าเริ่มต้นสาธารณะเราสามารถสร้างวัตถุด้วยวิธีนี้

MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();

. การใช้clone()
clone () สามารถใช้เพื่อสร้างสำเนาของวัตถุที่มีอยู่

MyObject anotherObject = new MyObject();
MyObject object = (MyObject) anotherObject.clone();

. การใช้การดีobject deserialization
ซีเรียลไลซ์เซชันของวัตถุคืออะไร แต่การสร้างวัตถุจากรูปแบบต่อเนื่องของมัน

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();

คุณสามารถอ่านได้จากที่นี่


10
ดังนั้นจริงๆแล้วมีเพียง 2 วิธี: การเรียก constructor (โดยใช้ new, clone () หรือ reflection) และ deserialization ที่ไม่เรียกใช้ constructor
AlexR

13
@AlexR: Object.clone()ไม่เรียกใช้ตัวสร้างเช่นกัน
axtavt

1
ดูเหมือนว่านี่จะเป็นคำตอบที่ด้านบนคุณสามารถเพิ่มการสร้างอาร์เรย์เป็นเคสย่อยใน A และ B ได้หรือไม่? (ดูคำตอบของฉันสำหรับรายละเอียด)
Paŭlo Ebermann

Deserialisation เรียกใช้ตัวสร้างไม่ใช่ชนิดที่ได้รับมามากที่สุด
Tom Hawtin - tackline

2
คุณควรพูดถึงConstructorคลาสที่พูดถึงเรื่องทั่วไปClass.newInstanceด้วย
templatetypedef

68

มีหลายวิธี:

  • Class.newInstanceตลอด
  • Constructor.newInstanceตลอด
  • ผ่าน deserialisation (ใช้ตัวสร้าง no-args ของคลาสพื้นฐานที่ไม่ได้รับส่วนใหญ่)
  • ผ่านObject.clone( ไม่เรียกตัวสร้าง )
  • ผ่าน JNI (ควรเรียกตัวสร้าง)
  • ผ่านวิธีการอื่นใดที่เรียกร้องnewให้คุณ
  • ฉันเดาว่าคุณสามารถอธิบายการโหลดคลาสเป็นการสร้างวัตถุใหม่ (เช่น interned Strings)
  • อาร์เรย์ตัวอักษรเป็นส่วนหนึ่งของการเริ่มต้นในการประกาศ (ไม่มีตัวสร้างสำหรับอาร์เรย์)
  • อาร์เรย์ใน "varargs" ( ...) การเรียกใช้เมธอด (ไม่มีตัวสร้างสำหรับอาร์เรย์)
  • การต่อสตริงค่าคงที่แบบไม่คอมไพล์เวลา (เกิดขึ้นกับการสร้างวัตถุอย่างน้อยสี่อย่าง
  • ทำให้เกิดข้อยกเว้นที่จะสร้างและโยนโดยรันไทม์ ยกตัวอย่างเช่นหรือthrow null;"".toCharArray()[0]
  • โอ้และการชกมวยของชนพื้นเมือง (ยกเว้นในแคช) แน่นอน
  • JDK8 ควรมี lambdas (โดยพื้นฐานแล้วจะมีคลาสภายในที่ไม่ระบุชื่อ) ซึ่งถูกแปลงเป็นวัตถุโดยปริยาย
  • เพื่อความสมบูรณ์ (และPaŭlo Ebermann) มีไวยากรณ์ด้วยnewคำหลักเช่นกัน

6
คุณควรเพิ่ม "วิธีปกติ" ด้วย :-)
Paŭlo Ebermann

@ Paŭlo Ebermann นั่นเป็นโรงเรียนเก่าแก่และไม่ได้พูดถึง (ฉันคิดว่าสิ่งที่คำถามหมายถึง "ใช้ตัวสร้าง (แม้ว่าส่วนใหญ่ แต่ไม่ใช่ทั้งหมดข้างต้นใช้ตัวสร้าง / a ที่ไหนสักแห่งตามแนว))
Tom Hawtin - tackline

จริงๆแล้วมีเพียง 3 วิธีในการทำซึ่งฉันได้เพิ่มความคิดเห็น
bestsss

3
คุณพลาดหนึ่ง: java.misc.Unsafe.allocateInstance(). แม้ว่าจะน่ารังเกียจด้วยเหตุผลหลายประการ และที่จริงแล้วการดีซีเรียลไลซ์เซชั่นไม่ได้ใช้คอนสตรัคเตอร์ที่ไม่ต้องพิจารณา ภายใต้ประทุนนั้นจะใช้allocateInstanceหรือเทียบเท่ากับมนต์ดำ
สตีเฟ่นซี

คำตอบที่ดีที่สุด แต่ JNI AllocObject().ไม่ได้เรียกตัวสร้าง
มาร์ควิสแห่ง Lorne

25

ภายในภาษา Java วิธีเดียวในการสร้างวัตถุคือการเรียก constructor ของมันไม่ว่าจะโดยชัดแจ้งหรือโดยปริยาย การใช้ผลลัพธ์การสะท้อนกลับในการเรียกไปยังวิธีการสร้าง, deserialization ใช้การสะท้อนกลับเพื่อเรียกใช้ตัวสร้างวิธีการจากโรงงานตัดการเรียกไปยังตัวสร้างเพื่อนามธรรมการก่อสร้างจริงและการโคลนคือการเรียกการสร้างแบบเดียวกัน


1
ไม่ถูกต้อง Deserializatio ไม่เรียกคอนสตรัคเตอร์ของคลาสไม่ว่าโดยชัดแจ้งหรือโดยปริยาย
มาร์ควิสแห่ง Lorne

2
ฉันไม่ควรเขียน 'ตัวสร้าง' และ 'ตัวสร้าง' แต่ควรเป็น 'ตัวสร้าง' และ 'ตัวสร้าง' ในกรณีของการดีซีเรียลไลเซชันคอนสตรัคเตอร์ no-arg ที่ใช้งานได้จะถูกเรียกใช้เสมอ
ความสับสน

1
การใช้งานเริ่มต้นของการโคลนไม่เรียกใช้ตัวสร้างใด ๆ
Didier L

หากนี่เป็นการนำเมธอดโคลนของฉันไปใช้ "return super.clone ();" จากนั้นจะไม่เรียกใช้ตัวสร้าง
Mateen

13

ใช่คุณสามารถสร้างวัตถุโดยใช้การสะท้อน ตัวอย่างเช่นString.class.newInstance()จะให้วัตถุสตริงว่างใหม่แก่คุณ


1
ถ้าฉันใช้มันมันขอให้ฉันใส่ในบล็อกลอง / จับ
GuruKulki

2
ใช่มีหลายกรณีที่สามารถโยนข้อยกเว้นได้ ดู JavaDoc สำหรับ newInstance () สำหรับตัวอย่างของสิ่งที่อาจผิดพลาด
Thomas Lötzer

11

มีห้าวิธีในการสร้างวัตถุใน Java

1. การใช้newคีย์เวิร์ด → constructor ถูกเรียก

Employee emp1 = new Employee();

2. ใช้newInstance()วิธีการของตัวClassสร้าง→รับเรียก

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                                .newInstance();

มันยังสามารถเขียนเป็น

Employee emp2 = Employee.class.newInstance();

3. การใช้newInstance()วิธีการของตัวConstructorสร้าง→รับเรียก

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

4. ใช้clone()method →ไม่มีการเรียก constructor

Employee emp4 = (Employee) emp3.clone();

5. การใช้ deserialization →ไม่มีการเรียก constructor

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

newคีย์เวิร์ดสามเมธอดแรกและทั้งสองnewInstance()รวมการเรียก constructor แต่หลังจากนั้นสอง clone และ deserialization

วิธีการทั้งหมดข้างต้นมีวิธีการเข้ารหัสแบบต่าง ๆ ที่เกี่ยวข้องอ่านวิธีการที่แตกต่างกันในการสร้างวัตถุใน Java พร้อมตัวอย่างสำหรับตัวอย่าง

อย่างไรก็ตามเราสามารถยืนยันว่าการสร้างอาร์เรย์หรือวัตถุสตริงเป็นวิธีการสร้างวัตถุ แต่สิ่งเหล่านี้มีความเฉพาะเจาะจงกับบางคลาสเท่านั้นและจัดการโดยตรงโดย JVM ในขณะที่เราสามารถสร้างวัตถุของคลาสใด ๆ โดยใช้ 5 วิธีเหล่านี้


กรุณาเปิดเผยพันธมิตรใด ๆและไม่ใช้เว็บไซต์เป็นวิธีการส่งเสริมเว็บไซต์ของคุณผ่านการโพสต์ ดูฉันจะเขียนคำตอบที่ดีได้อย่างไร .
Yvette



6

สิ่งนี้จะสังเกตได้ถ้าคุณยังใหม่กับจาวาทุกวัตถุได้รับมาจากวัตถุ

การป้องกัน Native Object clone () พ่น CloneNotSupportedException;


@stacker: คุณช่วยอธิบายเกี่ยวกับการสร้างวัตถุใหม่ได้อย่างไร ขอบคุณ
ryanprayogo

4
@ryanprayogo clone () จะส่งคืนวัตถุใหม่ (แม้ว่าวัตถุนั้นจะเป็นโคลนของวัตถุที่เรียกว่า clone ()) และจริงๆแล้วเป็นวิธีเดียวที่จะสร้างวัตถุใหม่โดยไม่ต้องเรียกตัวสร้าง
โทมัสLötzer

6

นอกจากนี้คุณยังสามารถยกเลิกการทำให้ข้อมูลเป็นวัตถุ สิ่งนี้ไม่ผ่าน Constructor ของชั้นเรียน!


ปรับปรุง : ขอบคุณทอมที่ชี้ให้เห็นในความคิดเห็นของคุณ! และไมเคิลก็ทำการทดลองด้วยเช่นกัน

มันผ่านตัวสร้างของ superclass ที่ไม่ต่อเนื่องที่ได้มามากที่สุด
และเมื่อคลาสนั้นไม่มีคอนสตรัคเตอร์ที่ไม่ถูกต้อง InvalidClassException จะถูกส่งออกไปตามการทำให้เป็นอนุกรม

โปรดดูคำตอบของ Tom สำหรับการรักษาทุกกรณี ;-)
มีวิธีอื่นในการสร้างวัตถุโดยไม่ใช้คำหลัก "ใหม่" ใน java


1
มันจะผ่านคอนสตรัค (คอนสตรัคเตอร์ no-ARG ของ superclass ที่ไม่ใช่อนุกรมที่ได้มามากที่สุด)
Tom Hawtin - tackline

1
@Tom Oh ว้าว - ฉันไม่ทราบและทดลองเล็กน้อย เห็นได้ชัดว่าเมื่อซูเปอร์คลาสที่ไม่ได้ต่อเนื่องที่ได้รับมาส่วนใหญ่ไม่มีคอนสตรัคเตอร์ที่ไม่เป็นไปได้มันจะส่งผลให้ InvalidClassException ถูกต่อเนื่องเป็นสตรีมและถูกโยนลงเมื่อ deserialization !! - มันแปลกประหลาดขนาดไหน?
Michael Borgwardt

6

มีชนิดของวัตถุที่ไม่สามารถถูกสร้างขึ้นโดยกลไกการสร้างอินสแตนซ์ปกติ (โทรก่อสร้าง) เป็น: อาร์เรย์ อาร์เรย์ถูกสร้างขึ้นด้วย

 A[] array = new A[len];

หรือ

 A[] array = new A[] { value0, value1, value2 };

ดังที่ฌอนกล่าวไว้ในความคิดเห็นนี่คือวากยสัมพันธ์คล้ายกับการเรียก constructor และภายในมันไม่มากไปกว่าการจัดสรรและการเริ่มต้นเป็นศูนย์ (หรือการเริ่มต้นด้วยเนื้อหาที่ชัดเจนในกรณีที่สอง) บล็อกหน่วยความจำ ประเภทและความยาว

เมื่อส่งอาร์กิวเมนต์ไปยัง varargs-method อาร์เรย์จะถูกสร้างขึ้น (และเติม) โดยปริยายเช่นกัน

วิธีที่สี่จะเป็น

 A[] array = (A[]) Array.newInstance(A.class, len);

แน่นอนว่าการโคลนนิ่งและการลดความน่าเชื่อถือนั้นก็ทำงานที่นี่เช่นกัน

มีวิธีการมากมายใน Standard API ซึ่งสร้างอาร์เรย์ แต่จริงๆแล้วพวกเขาทั้งหมดกำลังใช้หนึ่ง (หรือมากกว่า) ของวิธีเหล่านี้


จริงอยู่ที่คุณไม่สามารถกำหนดตัวสร้างอาร์เรย์ แต่นอกเหนือจากนั้นกลไกคือnewคำหลักเดียวกัน Array.newInstance เป็นกลไกใหม่เท่านั้นที่นี่
Sean Patrick Floyd

@Sean: เป็นคำหลักเดียวกัน แต่เป็นกลไกภายในที่แตกต่างกันมากฉันกล้าพูด
Paŭlo Ebermann

แน่นอนว่าเป็นเรื่องจริง แต่ในทางกลับกันการสร้างอาเรย์รุ่นต่าง ๆ จะค่อนข้างเหมือนกันภายใน เพิ่งรู้ว่าคำตอบของคุณมาจาก 2011 ขออภัยสำหรับการกวนสิ่งเก่า :-)
Sean Patrick Floyd

@Sean: ไม่มีปัญหาฉันใช้โอกาสนี้เพื่อทำการแก้ไขไวยากรณ์
Paŭlo Ebermann

เยี่ยมมากไม่มีใครพูดถึงเรื่องอาร์เรย์!
Mateen

5

วิธีอื่นถ้าเราหมดแรง

  • บน Oracle JVM คือ Unsafe.allocateInstance () ซึ่งสร้างอินสแตนซ์โดยไม่ต้องเรียกตัวสร้าง
  • โดยใช้การจัดการรหัสไบต์คุณสามารถเพิ่มรหัสanewarray, multianewarray, หรือnewarray newสามารถเพิ่มได้โดยใช้ไลบรารีเช่น ASM หรือ BCEL เวอร์ชันของ bcel มาพร้อมกับ Java ของ Oracle สิ่งนี้ไม่ได้เรียกว่านวกรรมิก แต่คุณสามารถเรียกนวกรรมิกเป็นการโทรแยก


4

การสะท้อนกลับก็จะทำงานให้คุณ

SomeClass anObj = SomeClass.class.newInstance();

เป็นอีกวิธีในการสร้างอินสแตนซ์ใหม่ของคลาส ในกรณีนี้คุณจะต้องจัดการกับข้อยกเว้นที่อาจถูกโยน


4
  • ใช้newโอเปอเรเตอร์ (เรียกใช้ตัวสร้าง)
  • ใช้การสะท้อนclazz.newInstance()(ซึ่งเรียกใช้ตัวสร้างอีกครั้ง) หรือโดยclazz.getConstructor(..).newInstance(..)(อีกครั้งโดยใช้ตัวสร้าง แต่คุณสามารถเลือกได้)

เพื่อสรุปคำตอบ - หนึ่งวิธีหลัก - โดยเรียกใช้ Constructor ของคลาสของวัตถุ

อัปเดต: คำตอบอื่นแสดงสองวิธีที่ไม่เกี่ยวข้องกับการใช้ constructor - deseralization and cloning


4

มีห้าวิธีที่แตกต่างในการสร้างวัตถุใน Java:

1. การใช้คำหลัก `ใหม่ ':

นี่เป็นวิธีทั่วไปในการสร้างวัตถุใน Java วัตถุเกือบ 99% ถูกสร้างขึ้นด้วยวิธีนี้

MyObject object = new MyObject();//normal way

2. โดยใช้วิธีการจากโรงงาน:

ClassName ObgRef=ClassName.FactoryMethod();

ตัวอย่าง:

RunTime rt=Runtime.getRunTime();//Static Factory Method

3. โดยใช้แนวคิดการโคลน:

โดยการใช้clone()ที่clone()สามารถใช้ในการสร้างสำเนาของวัตถุที่มีอยู่

MyObjectName anotherObject = new MyObjectName();
MyObjectName object = anotherObjectName.clone();//cloning Object

4. การใช้ 'Class.forName ()':

ถ้าเรารู้ชื่อของคลาส & ถ้ามันมีตัวสร้างค่าเริ่มต้นสาธารณะเราสามารถสร้างวัตถุด้วยวิธีนี้

MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance();

ตัวอย่าง:

String st=(String)Class.forName("java.lang.String").newInstance();

5. การใช้การดีซีเรียลไลซ์เซชันของวัตถุ:

การดีซีเรียลไลซ์เซชั่นของวัตถุเป็นเพียงการสร้างวัตถุจากรูปแบบต่อเนื่อง

ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream );
MyObjectName object = (MyObjectNmae) inStream.readObject();

(4) ต้องการเพียงClass.forName()ถ้าคุณยังไม่มีคลาสซึ่งในกรณีอื่น ๆ ทั้งหมดที่คุณทำ นอกจากนี้ยังไม่จำเป็นต้องมีคอนสตรัคเตอร์ที่ไม่ต้องมี: มีวิธีการเรียกคอนสตรัคสาธารณะใด ๆ หากคุณทราบข้อโต้แย้งที่ถูกต้อง และคุณเหลืออีกสองวิธี
มาร์ควิสแห่งลอร์น

2
(2) วิธีการของโรงงานเป็นเพียงรูปแบบสำหรับการรับวัตถุ แต่ภายในใช้คำสำคัญ "ใหม่" สำหรับการสร้างวัตถุ
Karthik Bose

ผู้ชายทำไมผู้คนมากมายถึงบอกว่าวิธีการจากโรงงานสร้างวัตถุพวกคุณเรียนรู้สิ่งนี้จากที่ไหน?
Mateen

3

นอกจากนี้คุณยังสามารถโคลนวัตถุที่มีอยู่ (ถ้าใช้ Cloneable)

Foo fooClone = fooOriginal.clone (); 

2

วิธีที่ 1

ใช้คำหลักใหม่ นี่เป็นวิธีทั่วไปในการสร้างวัตถุใน java วัตถุเกือบ 99% ถูกสร้างขึ้นด้วยวิธีนี้

Employee object = new Employee();

วิธีที่ 2

ใช้ Class.forName () Class.forName () ช่วยให้คุณวัตถุคลาสซึ่งมีประโยชน์สำหรับการสะท้อน วิธีการที่วัตถุนี้มีการกำหนดโดย Java ไม่ใช่โดยโปรแกรมเมอร์ที่เขียนชั้นเรียน พวกเขาเหมือนกันสำหรับทุกชั้นเรียน การเรียก newInstance () ที่ให้อินสแตนซ์ของคลาสนั้น (เช่น callingClass.forName ("ExampleClass") newInstance () เทียบเท่ากับการเรียก newClassClass () ใหม่ซึ่งคุณสามารถเรียกใช้เมธอดที่คลาสกำหนด เข้าถึงฟิลด์ที่มองเห็นได้ ฯลฯ

Employee object2 = (Employee) Class.forName(NewEmployee).newInstance();

Class.forName () จะใช้ ClassLoader ของผู้โทรเสมอในขณะที่ ClassLoader.loadClass () สามารถระบุ ClassLoader ที่แตกต่างกัน ฉันเชื่อว่า Class.forName เริ่มต้นคลาสที่โหลดเช่นกันในขณะที่วิธีการ ClassLoader.loadClass () ไม่ได้ทำเช่นนั้นทันที (มันไม่ได้เริ่มต้นจนกว่าจะใช้เป็นครั้งแรก)

ต้องอ่าน:

Java: บทนำสถานะเธรดพร้อมด้วยตัวอย่าง Java Enum ตัวอย่างง่าย ๆ

วิธีที่ 3

ใช้โคลน () สามารถใช้โคลน () เพื่อสร้างสำเนาของวัตถุที่มีอยู่ได้

Employee secondObject = new Employee();
Employee object3 = (Employee) secondObject.clone();

วิธีที่ 4

ใช้วิธี newInstance ()

Object object4 = Employee.class.getClassLoader().loadClass(NewEmployee).newInstance();

วิธีที่ 5

การใช้การดีซีเรียลไลซ์ชันของวัตถุ Object Deserialization ไม่มีอะไรนอกจากสร้างวัตถุจากรูปแบบต่อเนื่อง

// Create Object5
// create a new file with an ObjectOutputStream
FileOutputStream out = new FileOutputStream("");
ObjectOutputStream oout = new ObjectOutputStream(out);

// write something in the file
oout.writeObject(object3);
oout.flush();

// create an ObjectInputStream for the file we created before
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("crunchify.txt"));
Employee object5 = (Employee) ois.readObject();

อย่าใช้การจัดรูปแบบรหัสสำหรับข้อความที่ไม่ใช่รหัส มีวิธีการมากกว่านี้ อ่านคำตอบอื่น ๆ 'เกือบ 99%' เป็นเพียงการคาดเดา
มาร์ควิสแห่ง Lorne

สวัสดี EJP ขออภัยสำหรับความผิดพลาดนี้ ... ฉันบอกว่านี่เป็นวิธีหนึ่งในการสร้างวัตถุที่ไม่ได้บอกว่าเป็นรูปแบบที่ถูกต้องเพียงแค่เป็นแบบจำลอง .. และขอโทษด้วยที่รักและเป็นคนใหม่ในการ stackoverflow
Andriya

0

จากมุมมองของผู้ใช้ API ทางเลือกอื่นสำหรับตัวสร้างเป็นวิธีคงที่จากโรงงาน (เช่น BigInteger.valueOf ()) แต่สำหรับผู้เขียน API (และเทคนิค "สำหรับจริง") วัตถุยังคงสร้างโดยใช้ตัวสร้าง


-1

ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดยการสร้าง แต่คนอื่น ๆ คือ:

  • วิธีการโคลน
  • ซีเรียลไลซ์
  • การสะท้อน (Class.newInstance ())
  • การสะท้อน (วัตถุตัวสร้าง)

2
3 และ 4 เป็นนามแฝงที่แตกต่างกันสำหรับกลไกเดียวกัน
ฌอนแพทริคฟลอยด์

-2

นอกจากนี้ยังมี ClassLoader.loadClass (สตริง) แต่ไม่ได้ใช้บ่อย

และถ้าคุณต้องการเป็นทนายโดยรวมแล้วอาร์เรย์นั้นเป็นวัตถุทางเทคนิคเพราะคุณสมบัติ. ความยาวของอาร์เรย์ ดังนั้นการเริ่มต้นอาร์เรย์สร้างวัตถุ


1
loadClass (ชื่อสตริง) ส่งคืนผลลัพธ์คลาสอ็อบเจ็กต์ซึ่งเป็นวัตถุใช่ แต่ไม่ใช่วัตถุของคลาสนั้น หากได้รับตัวอย่างเราสามารถหาตัวอย่างจำนวนมากได้ทั่วทั้งไลบรารีของจาวา แต่สิ่งเหล่านั้นจะเป็นคลาสเฉพาะ ตรวจสอบyoutu.be/gGGCmrD6Qpw
nanosoft

-3

เราสามารถสร้างวัตถุได้ 5 วิธี:

  1. โดยผู้ประกอบการใหม่
  2. ตามการสะท้อนกลับ (เช่น Class.forName () ตามด้วย Class.newInstance ())
  3. โดยวิธีการโรงงาน
  4. โดยการโคลนนิ่ง
  5. โดยการสะท้อน API

3
Class.forName () โหลดคลาสแทนที่จะสร้างวัตถุ
มาร์ควิสแห่งลอร์น

สะท้อน? แน่นอนคุณหมายถึงการสะท้อน
สตีเฟ่นซี

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

-5

นอกจากนี้เรายังสามารถสร้างวัตถุด้วยวิธีนี้: -

String s ="Hello";

ไม่มีใครพูดถึงเรื่องนี้


นี่เป็นวิธีการสร้างชนิดข้อมูลดั้งเดิมมันเป็นเพียงความยืดหยุ่นที่ Java ให้ไว้เบื้องหลังไม่ให้ใช้คำหลัก "ใหม่" ซึ่งเป็นคำเดียวกับคำหลักใหม่
Madusudanan

Madhusudan, FYI, ด้วยความช่วยเหลือของโอเปอเรเตอร์ใหม่, วัตถุควรเก็บไว้ในกองเสมอในกรณีนี้ "Hello" เป็นวัตถุที่ควรเก็บใน String pool และ String เป็นคลาสที่ไม่ใช่ประเภทข้อมูลดั้งเดิม
Deepak Sharma

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