คลาสที่ไม่ระบุชื่อคือคลาสที่ไม่สามารถมีชื่อได้ ดังนั้นจึงไม่มีทางที่จะอ้างอิงถึงคลาสเหล่านั้นได้ จะต้องประกาศให้เป็นส่วนหนึ่งของคำสั่งใหม่ในขณะที่สร้าง นี้ต้องมีรูปแบบอื่นของคำสั่งใหม่ดังนี้ ใหม่ <คลาสหรืออินเทอร์เฟซ> <เนื้อหาของคลาส> รูปแบบของคำสั่งใหม่นี้ประกาศคลาสที่ไม่ระบุชื่อใหม่ที่ขยายคลาสที่กำหนดหรือใช้อินเทอร์เฟซที่กำหนด นอกจากนี้ยังสร้างอินสแตนซ์ใหม่ของคลาสนั้นและส่งกลับเป็นผลลัพธ์ของคำสั่ง คลาสที่จะขยายและอินเทอร์เฟซที่จะนำไปใช้คือตัวถูกดำเนินการของคำสั่งใหม่ ตามด้วยเนื้อหาของคลาสที่ไม่ระบุชื่อ หากคลาสที่ไม่ระบุชื่อขยายคลาสอื่น ร่างกายของคลาสจะสามารถเข้าถึงสมาชิกของคลาส แทนที่วิธีการของคลาส ฯลฯ เช่นเดียวกับคลาสมาตรฐานอื่นๆ หากคลาสที่ไม่ระบุชื่อใช้อินเทอร์เฟซ ร่างกายจะต้องใช้วิธีการของอินเทอร์เฟซ
รหัสจาวา
คัดลอกรหัสรหัส ดังต่อไปนี้:
อินเตอร์เฟซราคา
-
โมฆะ print1();
-
คลาสสาธารณะ noNameClass
-
ประชาสัมพันธ์สาธารณะ()
-
คืนราคาใหม่ () {
โมฆะสาธารณะ print1()
-
System.out.println("สวัสดีชาวโลก!!");
-
-
-
โมฆะคงสาธารณะ main (String args [])
-
noNameClass c = noNameClass ใหม่ ();
ราคา hw=c.dest();
hw.print1();
-
-
PR อาจเป็นคลาสก็ได้ แต่วิธีการที่คุณเรียกจากภายนอกจะต้องถูกประกาศในคลาสหรืออินเทอร์เฟซของคุณ วิธีการภายในคลาสที่ไม่ระบุตัวตนไม่สามารถถูกเรียกจากภายนอกได้
บางทีตำแหน่งที่ใช้บ่อยที่สุดสำหรับคลาสที่ไม่ระบุชื่อภายในใน Java ก็คือการเพิ่ม Listner ไปยัง Frame
ดังต่อไปนี้:
รหัสจาวา
คัดลอกรหัสรหัส ดังต่อไปนี้:
นำเข้า java.awt.*;
นำเข้า java.awt.event.*;
QFrame คลาสสาธารณะขยายเฟรม {
QFrame สาธารณะ () {
this.setTitle(/"แอปพลิเคชันของฉัน/");
addWindowListener (WindowAdapter ใหม่ () {
โมฆะสาธารณะ windowClosing (WindowEvent e) {
กำจัด();
System.ออก(0);
-
-
this.setBounds(10,10,200,200);
-
-
คลาสที่ไม่ระบุชื่อภายในคือการสร้างคลาสภายใน แต่ไม่ได้ให้ชื่อแก่คุณ นั่นคือไม่มีตัวแปรที่อ้างถึงอินสแตนซ์
คัดลอกรหัสรหัส ดังต่อไปนี้:
WindowAdapter ใหม่ () {
โมฆะสาธารณะ windowClosing (WindowEvent e) {
กำจัด();
System.ออก(0);
-
-
ใหม่คือการสร้างวัตถุ WindowAdapter และ {} ต่อไปนี้บ่งชี้ว่าการดำเนินการในวงเล็บดำเนินการกับชื่อวัตถุเริ่มต้น และสิ่งต่อไปนี้ในโปรแกรม Java ข้างต้นคือเนื้อหาของฟังก์ชัน
วัตถุประสงค์ของการใช้งานนี้คือเพื่อสร้างอินสแตนซ์ของออบเจ็กต์และแทนที่ฟังก์ชันอย่างใดอย่างหนึ่ง คุณสามารถค้นหาได้โดยเปิดรหัส WindowAdapter มันเป็นคลาสนามธรรม เป็นการนำอินเทอร์เฟซ WindowListener ไปใช้ พารามิเตอร์ของ Frame.addWindowListner(); คือ WindowListner และการนำไปใช้งานจะต้องส่งผ่านคลาสที่ไม่ระบุชื่อที่ได้รับมาจาก WindowAdapter
1. จะตรวจสอบการมีอยู่ของคลาสที่ไม่ระบุตัวตนได้อย่างไร? ฉันไม่เห็นชื่อ รู้สึกเหมือนเป็นเพียงวัตถุที่สร้างขึ้นใหม่จากคลาสหลัก และไม่มีชื่อของคลาสที่ไม่ระบุชื่อ
มาดูรหัสเทียมกันก่อน
คัดลอกรหัสรหัส ดังต่อไปนี้:
คลาสนามธรรมพ่อ () {
-
-
การทดสอบในชั้นเรียนสาธารณะ{
Father f1 = new Father(){ .... } //ที่นี่มีคลาสภายในที่ไม่เปิดเผยตัวตน
-
โดยทั่วไป เมื่อมีวัตถุใหม่ ควรมีเครื่องหมายอัฒภาคหลังวงเล็บ นั่นคือคำสั่งของวัตถุใหม่สิ้นสุดลง
แต่จะแตกต่างออกไปเมื่อมีคลาสภายในที่ไม่ระบุชื่อ วงเล็บจะตามหลังด้วยเครื่องหมายปีกกา และเครื่องหมายปีกกามีวิธีการใช้งานเฉพาะของออบเจ็กต์ใหม่
เพราะเรารู้ว่าคลาสนามธรรมไม่สามารถเป็นคลาสใหม่ได้โดยตรง ต้องมีคลาสการใช้งานก่อนจึงจะสามารถสร้างคลาสการใช้งานใหม่ได้
โค้ดเทียมข้างต้นบ่งชี้ว่า new คือคลาสการใช้งานของ Father และคลาสการใช้งานนี้เป็นคลาสภายในที่ไม่ระบุชื่อ
ในความเป็นจริงการแยกคลาสภายในที่ไม่ระบุชื่อด้านบนสามารถทำได้
คัดลอกรหัสรหัส ดังต่อไปนี้:
คลาส SonOne ขยายพ่อ{
...//โค้ดที่นี่เหมือนกับคลาสภายในที่ไม่ระบุชื่อด้านบน ซึ่งเป็นโค้ดในวงเล็บปีกกา
-
การทดสอบในชั้นเรียนสาธารณะ{
พ่อ f1 = SonOne ใหม่ ();
-
2. ข้อควรระวังสำหรับคลาสภายในที่ไม่ระบุชื่อ โปรดทราบว่าการประกาศคลาสที่ไม่ระบุชื่อจะทำในเวลาคอมไพล์ และการสร้างอินสแตนซ์จะทำที่รันไทม์ ซึ่งหมายความว่าคำสั่งใหม่ใน for loop จะสร้างอินสแตนซ์ของคลาสที่ไม่ระบุชื่อเดียวกันหลายอินสแตนซ์ แทนที่จะสร้างอินสแตนซ์เดียวของคลาสที่ไม่ระบุชื่อที่แตกต่างกันหลายรายการ
เมื่อใช้คลาสภายในที่ไม่ระบุชื่อ โปรดคำนึงถึงหลักการต่อไปนี้:
・คลาสภายในที่ไม่ระบุชื่อไม่สามารถมีคอนสตรัคเตอร์ได้
・คลาสภายในที่ไม่ระบุชื่อไม่สามารถกำหนดสมาชิก วิธีการ และคลาสแบบคงที่ได้
・คลาสภายในที่ไม่เปิดเผยตัวตนไม่สามารถเป็นแบบสาธารณะ ได้รับการป้องกัน ส่วนตัว หรือคงที่
・สามารถสร้างคลาสภายในที่ไม่ระบุชื่อได้เพียงอินสแตนซ์เดียวเท่านั้น
・คลาสภายในที่ไม่ระบุชื่อจะต้องอยู่หลัง new และใช้เพื่อใช้อินเทอร์เฟซหรือนำคลาสไปใช้โดยปริยาย
・เนื่องจากคลาสภายในที่ไม่ระบุตัวตนเป็นคลาสภายในในท้องถิ่น ข้อจำกัดทั้งหมดเกี่ยวกับคลาสภายในท้องถิ่นจึงมีผลบังคับใช้
・คลาสภายในสามารถเข้าถึงเฉพาะตัวแปรคงที่หรือวิธีการคงที่ของคลาสภายนอกเท่านั้น
สิ่งนี้ในคลาสที่ไม่ระบุชื่อและคลาสภายใน:
บางครั้งเราจะใช้คลาสภายในและคลาสที่ไม่ระบุชื่อ เมื่อใช้สิ่งนี้ในคลาสที่ไม่ระบุชื่อ สิ่งนี้หมายถึงคลาสที่ไม่ระบุชื่อหรือคลาสภายในนั่นเอง ในเวลานี้หากเราต้องการใช้เมธอดและตัวแปรของคลาสภายนอก เราควรเพิ่มชื่อคลาสของคลาสภายนอก
3. บทบาทของชนชั้นภายในที่ไม่เปิดเผยตัวตน
คลาสภายในของ Java นั้นแตกต่างโดยพื้นฐานจากคลาสที่ซ้อนกันใน C++: คลาสที่ซ้อนกันของ C++ ไม่มีตัวจัดการสำหรับคลาส wrapper มันเป็นเพียงการแสดงออกถึงแนวคิดของการห่อหุ้มเท่านั้น แต่คลาสภายในของ Java นั้นแตกต่างออกไป มันสามารถเข้าถึงสมาชิกของคลาสการห่อได้ (ซึ่งหมายความว่ามีตัวจัดการสำหรับคลาสการห่อ)
คลาสภายในที่ไม่ระบุชื่อเป็นวิธีการเขียนคลาสภายในที่เรียบง่าย: return new Wrapper {
-
-
เทียบเท่ากับ: Wrapped ขยาย Wrapper {
-
-
กลับห่อใหม่ ();
นี่เป็นเพียงบทบาทเดียวของคลาสภายในที่ไม่เปิดเผยตัวตนหรือไม่?
พิจารณากรณีนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
อินเทอร์เฟซ ICount {
นับ int();
-
คลาสผู้ปกครอง {
int i = 0;
จำนวน int() {
ส่งคืน i++;
-
-
มีคลาส Child ซึ่งไม่เพียงต้องการสืบทอดเมธอด count() ของ Parent เท่านั้น แต่ยังต้องการใช้เมธอด count ในอินเทอร์เฟซ ICount ด้วย ชั้นเรียนภายในสามารถเข้ามามีบทบาทได้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
คลาสเด็กขยายผู้ปกครอง {
ICountgetCount() {
ส่งคืน ICount ใหม่ {
int i = 0;
จำนวน int() {
กลับ (i *= 2);
-
-
-
-
ดูรหัสนี้
คัดลอกรหัสรหัส ดังต่อไปนี้:
โมฆะคงที่สาธารณะ main (String [] args) {
theApp = ตัววิเคราะห์ใหม่ ();
SwingUtilities.invoidLater (Runnable ใหม่ () { // คลาส Runnable ที่ไม่ระบุชื่อ
// วัตถุ
public void run() { // วิธีการเรียกใช้ดำเนินการในเธรด
theApp.creatGUI(); // เรียกผู้สร้าง GUI แบบคงที่
-
-
-
โมฆะคงที่สาธารณะ main (String [] args) {
theApp = ตัววิเคราะห์ใหม่ (); // สร้างวัตถุ
SwingUtilities.invoidLater (Runnable ใหม่ () { // คลาส Runnable ที่ไม่ระบุชื่อ
// คลาสภายในที่ไม่ระบุชื่อที่ใช้เธรด
// เดิมทีวิธีการนี้คือการส่งพารามิเตอร์ประเภท Runnable // ซึ่งสามารถทำได้ผ่านวิธีการเรียนที่ไม่ระบุชื่อนี้
// วัตถุ
public void run() { // วิธีการเรียกใช้ดำเนินการในเธรด
theApp.creatGUI(); // เรียกผู้สร้าง GUI แบบคงที่
-
-
-