ไฟล์ java สามารถมีมากกว่าหนึ่งคลาสได้หรือไม่?


106

จุดประสงค์ของการมีมากกว่าหนึ่งคลาสในไฟล์ Java คืออะไร? ฉันยังใหม่กับ Java

แก้ไข: สามารถทำได้โดยการสร้างชั้นในภายในคลาสสาธารณะใช่ไหม?


คำตอบ:


128

ใช่มันทำได้ อย่างไรก็ตามสามารถมีคลาสระดับบนสุดสาธารณะได้เพียงหนึ่งคลาสต่อ.javaไฟล์และคลาสระดับบนสุดสาธารณะต้องมีชื่อเดียวกับไฟล์ต้นฉบับ

จุดประสงค์ของการรวมหลายคลาสไว้ในซอร์สไฟล์เดียวคือการรวมฟังก์ชันการสนับสนุนที่เกี่ยวข้อง (โครงสร้างข้อมูลภายในคลาสการสนับสนุน ฯลฯ ) ร่วมกับคลาสสาธารณะหลัก โปรดทราบว่าคุณไม่ควรทำเช่นนี้เสมอ - ผลกระทบเดียวคือความสามารถในการอ่าน (หรือไม่) ของรหัสของคุณ


1
ฉันคิดว่าเป็นความคิดที่ดีที่จะทำเช่นนั้นหากคุณต้องการให้ชั้นเรียนพิเศษนั้นเป็นแบบส่วนตัวดังนั้นจึงสามารถเปลี่ยนแปลงได้อย่างสมบูรณ์ในภายหลังโดยไม่ทำลายสิ่งใดภายนอกที่ใช้ชั้นเรียนเหล่านั้นโดยไม่ได้ตั้งใจ
Erich Kitzmueller

3
ในนั้นสำหรับความเข้ากันได้ 1.0 (ก่อนคลาสที่ซ้อนกัน) ถือเป็นความผิดพลาดอย่างใหญ่หลวงในด้านภาษา ข้อได้เปรียบที่ใหญ่ที่สุดสำหรับการใช้งานคือ IDE มีการจัดการไฟล์ที่สิ้นหวัง
Tom Hawtin - แทคไลน์

25
สาธารณะหนึ่งคลาสระดับบนสุดต่อไฟล์ สามารถมีคลาสภายในสาธารณะต่อไฟล์ได้มากเท่าที่คุณต้องการ
erickson

@ ทอมส่วนไหนที่คุณคิดว่าผิดพลาดคลาสชั้นในหรือชั้นบนสุดหลายชั้นต่อไฟล์
finnw

@finnw คลาสระดับบนสุดหลายรายการต่อไฟล์ มันผิดมาก อยู่ที่ไหนjava.awt.LightweightDispatcher?
Tom Hawtin - แท

17

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

แม้ว่าจะเป็นการดีที่จะมีคลาสส่วนตัวอย่างน้อยหนึ่งคลาสในซอร์สไฟล์เดียว แต่ฉันจะบอกว่ามันสามารถอ่านได้มากกว่าที่จะใช้คลาสภายในและคลาสที่ไม่ระบุชื่อแทน ตัวอย่างเช่นเราสามารถใช้คลาสที่ไม่ระบุชื่อเพื่อกำหนดคลาสตัวเปรียบเทียบภายในคลาสสาธารณะ:

  public static Comparator MyComparator = new Comparator() {
    public int compare(Object obj, Object anotherObj) {

    }
  };

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


1
ไม่ใช่คลาสส่วนตัวจริงๆหากอยู่ในไฟล์โดยไม่มีตัวปรับแต่ง คุณไม่สามารถมีคลาสส่วนตัวได้หากไม่มีคลาสชั้นในเพราะถ้าคุณทำแล้วใครจะใช้มันได้?
Bjorn


6

ไฟล์. java เรียกว่าหน่วยคอมไพล์ แต่ละหน่วยคอมไพล์อาจมีคลาสและอินเทอร์เฟซระดับบนสุดจำนวนเท่าใดก็ได้ หากไม่มีประเภทระดับบนสุดสาธารณะยูนิตคอมไพล์สามารถตั้งชื่ออะไรก็ได้

//Multiple.java
//preceding package and import statements

class MyClass{...}
interface Service{...}
...
//No public classes or interfaces
...

สามารถมีคลาส / อินเตอร์เฟสสาธารณะเพียงหนึ่งเดียวในหน่วยคอมไพล์ cu ต้องตั้งชื่อให้ตรงกับประเภทสาธารณะระดับบนสุดนี้

//Test.java
//named exactly as the public class Test
public class Test{...}
//!public class Operations{...}
interface Selector{...}
...
//Other non-public classes/interfaces

ประเด็นสำคัญเกี่ยวกับวิธีการหลัก - ตอนที่ 1

ส่วนที่ 2

(คะแนนเกี่ยวกับจำนวนชั้นเรียนและระดับการเข้าถึงในส่วนที่ 2)


5

ใช่คุณสามารถสร้างคลาสสาธารณะได้มากกว่าหนึ่งคลาส แต่ต้องเป็นคลาสที่ซ้อนกัน

public class first {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }

    public class demo1
    {

        public class demo2
        {

        }
    }
}

4

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

สิ่งนี้ช่วยให้คุณสร้างคลาสสองคลาสที่เชื่อมโยงกันอย่างแน่นหนาเช่นโมเดลและมุมมองโดยไม่ต้องเปิดเผยการนำไปใช้อย่างใดอย่างหนึ่ง อีกตัวอย่างหนึ่งคือคอลเล็กชันและตัวทำซ้ำ


4

โดยทั่วไปควรมีหนึ่งคลาสต่อไฟล์ หากคุณจัดระเบียบสิ่งต่างๆในลักษณะนั้นเมื่อคุณค้นหาชั้นเรียนคุณจะรู้ว่าคุณต้องค้นหาไฟล์ที่มีชื่อนั้นเท่านั้น

ข้อยกเว้นคือเมื่อคลาสถูกนำไปใช้อย่างดีที่สุดโดยใช้คลาสตัวช่วยขนาดเล็กอย่างน้อยหนึ่งคลาส โดยปกติโค้ดจะง่ายที่สุดในการติดตามเมื่อมีคลาสเหล่านั้นอยู่ในไฟล์เดียวกัน ตัวอย่างเช่นคุณอาจต้องการคลาส wrapper 'tuple' ขนาดเล็กเพื่อส่งผ่านข้อมูลบางส่วนระหว่างการเรียกใช้เมธอด อีกตัวอย่างหนึ่งคือคลาส 'งาน' ที่ใช้ Runnable หรือ Callable อาจมีขนาดเล็กมากจนรวมเข้ากับคลาสหลักที่สร้างและเรียกพวกเขาได้ดีที่สุด



2

ทำได้ แต่สามารถมีคลาสสาธารณะได้เพียง 1 คลาสในแพ็กเกจใดก็ได้เนื่องจากคอมไพเลอร์ java สร้างไฟล์. Class ซึ่งมีชื่อเดียวกับชื่อคลาสสาธารณะดังนั้นหากคลาสสาธารณะมากกว่า 1 คลาสจะเป็นการยากที่จะเลือก คอมไพเลอร์ว่าชื่อไฟล์ Class ควรเป็นอย่างไร



1

ฉันคิดว่ามันควรจะเป็น "คลาสสาธารณะระดับบนสุดที่ไม่มีสถานะคงที่เดียวต่อไฟล์. java" ไม่ใช่เหรอ?


คุณควรถามเป็นคำถามมากกว่าตอบที่นี่
Ashish Kumar

1

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

ตรวจสอบบทความวิกินี้

https://en.wikipedia.org/wiki/Singleton_pattern

แนวคิดนี้ใช้เวลาสักครู่ในการเคี้ยว


1

ในไฟล์. java สามารถมีคลาสระดับบนสุดสาธารณะเพียงคลาสเดียวที่มีชื่อเหมือนกับไฟล์ แต่อาจมีคลาสภายในสาธารณะหลายคลาสซึ่งสามารถส่งออกไปยังทุกคนและเข้าถึงฟิลด์ / วิธีการของคลาสภายนอกได้เช่น : AlertDialog.Builder (แก้ไขโดย 'public static') ในAlertDialog (แก้ไขโดย 'public')


1

ใช่คุณสามารถมีมากกว่าหนึ่งคลาสในไฟล์. Java หนึ่งไฟล์ แต่คุณทำให้หนึ่งในนั้นเป็นแบบสาธารณะ และบันทึกไฟล์. java ที่มีชื่อเดียวกับชื่อของคลาสสาธารณะ เมื่อคุณจะรวบรวมไฟล์. java นั้นกว่าที่คุณจะได้รับไฟล์. class แยกสำหรับแต่ละคลาสที่กำหนดไว้ในไฟล์. java

นอกจากนี้ยังมีวิธีการมากเกินไปในการกำหนดคลาสมากกว่าหนึ่งคลาสในไฟล์. java

  1. ใช้แนวคิดของ Inner Classes
  2. ใช้แนวคิดของคลาสที่ไม่เปิดเผยตัวตน

1

ครับ! ไฟล์. java สามารถมีคลาสสาธารณะได้เพียงคลาสเดียว

หากคุณต้องการให้คลาสทั้งสองนี้เป็นแบบสาธารณะจะต้องใส่เป็นไฟล์. java สองไฟล์: A.java และ B.java


2
ผมไม่แน่ใจว่ากว่าสิ่งที่ตอบสนองของคุณเพิ่มมากขึ้นจาก 12 คนอื่น ๆ ตอบ
ข้ามไป

1

ได้คุณสามารถมีมากกว่าหนึ่งคลาสในไฟล์. java หนึ่งในนั้นสามารถเป็นสาธารณะได้ ส่วนอื่น ๆ เป็นแพ็คเกจส่วนตัว ไม่สามารถเป็นส่วนตัวหรือได้รับการปกป้อง หากเป็นแบบสาธารณะไฟล์จะต้องมีชื่อของคลาสนั้น มิฉะนั้นสามารถกำหนดสิ่งใด ๆ ให้กับไฟล์นั้นเป็นชื่อได้

การมีหลายคลาสในไฟล์เดียวหมายความว่าคลาสเหล่านั้นอยู่ในแพ็คเกจเดียวกัน ดังนั้นคลาสอื่น ๆ ที่อยู่ในแพ็กเกจนั้น แต่ไม่อยู่ในไฟล์นั้นก็สามารถใช้คลาสเหล่านั้นได้เช่นกัน ยิ่งไปกว่านั้นเมื่อนำเข้าแพ็กเกจนั้นชั้นนำเข้าก็สามารถใช้งานได้เช่นกัน

สำหรับการตรวจสอบรายละเอียดเพิ่มเติมคุณสามารถเยี่ยมชมบล็อกโพสต์ของฉันในที่นี่


1
ยินดีต้อนรับสู่ Stack Overflow! ขอขอบคุณที่คุณได้ชี้แจงข้อมูลที่ยังไม่ได้กล่าวถึงในที่นี้ คุณยังอ้างถึงบล็อกโพสต์ของคุณได้ดีในขณะที่ประกาศความเป็นเจ้าของและรวมข้อมูลที่เกี่ยวข้องไว้ที่นี่ หากคุณเลือกที่จะมีส่วนร่วมในไซต์นี้มากขึ้นในอนาคต (และฉันหวังว่าคุณจะทำเช่นนั้น) อย่าลืมพิจารณาบทความนี้เพื่อให้แน่ใจว่าโพสต์ของคุณยังคงได้รับการตอบรับอย่างดีหากคุณอ้างถึงบล็อกของคุณ
4castle

0

ระดับบนสุดของชั้นสาธารณะสามารถมีได้เพียงคนเดียวในไฟล์เดียว ชื่อคลาสของคลาสสาธารณะนั้นควรเป็นชื่อของไฟล์ สามารถมีคลาสภายในสาธารณะได้มากมาย

คุณสามารถมีหลายคลาสในไฟล์เดียว ขีด จำกัด สำหรับระดับต่างๆของการมองเห็นคลาสในไฟล์มีดังนี้:

คลาสระดับบนสุด: คลาส
สาธารณะ 1 คลาส
0 คลาสส่วนตัวตาม
จำนวนคลาสเริ่มต้น / ที่มีการป้องกัน

ชั้นเรียนภายใน: ชั้นเรียนภายใน
จำนวนเท่าใดก็ได้ที่มีการมองเห็นใด ๆ (ค่าเริ่มต้น, ส่วนตัว, การป้องกัน, สาธารณะ)

กรุณาแก้ไขฉันถ้าฉันผิด


0

ใช่มันทำได้ อย่างไรก็ตามสามารถมีคลาสสาธารณะได้เพียงหนึ่งคลาสต่อไฟล์. java เนื่องจากคลาสสาธารณะต้องมีชื่อเดียวกับไฟล์ต้นฉบับ

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