Bir java dosyasının birden fazla sınıfı olabilir mi?


105

Bir Java dosyasında birden fazla sınıfa sahip olmanın amacı nedir? Java'da yeniyim.

Düzenlendi: Bu, bir kamu sınıfı içinde bir iç sınıf oluşturarak başarılabilir, değil mi?


Yanıtlar:


128

Evet yapabilir. Ancak, dosya başına yalnızca bir genel üst düzey sınıf olabilir .javave genel üst düzey sınıfların kaynak dosyayla aynı ada sahip olması gerekir.

Tek bir kaynak dosyaya birden çok sınıf eklemenin amacı, ilgili destek işlevlerini (dahili veri yapıları, destek sınıfları, vb.) Ana genel sınıfla birlikte bir araya getirmektir. Bunu yapmamanın her zaman uygun olduğunu unutmayın - tek etki kodunuzun okunabilirliği (ya da okunabilirliği) üzerinedir.


1
Bu ekstra sınıfları özel tutmak istiyorsanız, bunu yapmanın iyi bir fikir olduğunu düşünüyorum, böylece yanlışlıkla bu sınıfları kullanan herhangi bir şeyi bozmadan daha sonra tamamen değiştirilebilirler.
Erich Kitzmueller

3
1.0 uyumluluğu için oradadır (yuvalanmış sınıflardan önce). Dilde büyük bir hata. Kullanmanın en büyük avantajı, IDE'lerin umutsuz dosya işlemeye sahip olmasıdır.
Tom Hawtin - tackline

25
Dosya başına bir genel, üst düzey sınıf. Dosya başına istediğiniz kadar genel iç sınıf olabilir.
erickson

@Tom, hangi bölümün hata olduğunu düşünüyorsun, iç sınıflar mı yoksa dosya başına birden çok üst düzey sınıf mı?
finnw

@finnw Dosya başına birden çok üst düzey sınıf. Bu çok yanlış. Nerede java.awt.LightweightDispatcher?
Tom Hawtin - tackline

17

Herkese açık bir sınıf uygulamak istiyorsanız, onu o sınıfla aynı ada sahip bir dosyaya uygulamalısınız. Tek bir dosya, bir genel ve isteğe bağlı olarak bazı özel sınıfları içerebilir. Bu, sınıflar yalnızca genel sınıf tarafından dahili olarak kullanılıyorsa yararlıdır. Ayrıca genel sınıf, iç sınıfları da içerebilir.

Tek bir kaynak dosyada bir veya daha fazla özel sınıfa sahip olmak iyi olsa da, bunun yerine iç ve anonim sınıfları kullanmanın daha okunaklı olduğunu söyleyebilirim. Örneğin, bir genel sınıf içinde bir Karşılaştırıcı sınıfını tanımlamak için anonim bir sınıf kullanılabilir:

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

    }
  };

Comparator sınıfı, normalde herkese açık olması için ayrı bir dosya gerektirir. Bu şekilde, onu kullanan sınıfla paketlenir.


1
Değiştiricisiz dosyadaysa, gerçekten özel bir sınıf değildir . İçsel bir sınıf olmadan özel bir sınıfa sahip olamazsınız çünkü eğer yaparsanız, onu kim kullanabilir?
Bjorn

10

Evet, istediğiniz kadar!

AMA, her dosyada yalnızca bir "genel" sınıf.


6

.Java dosyasına derleme birimi denir. Her derleme birimi, herhangi bir sayıda üst düzey sınıf ve arabirim içerebilir. Herkese açık üst düzey tür yoksa, derleme birimi herhangi bir şekilde adlandırılabilir.

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

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

Bir derleme biriminde yalnızca bir genel sınıf / arabirim olabilir. Cu, tam olarak bu genel üst düzey tür olarak adlandırılmalıdır.

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

Ana yöntemle ilgili önemli noktalar - bölüm 1

Bölüm 2

(Bölüm 2'de kapsanan sınıf sayısı ve erişim seviyelerine ilişkin noktalar)


5

Evet, birden fazla genel sınıf oluşturabilirsiniz, ancak iç içe geçmiş bir sınıf olması gerekir.

public class first {

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

    public class demo1
    {

        public class demo2
        {

        }
    }
}

4

Anonim iç sınıfların yanı sıra, başka bir kullanım, genel bir arabirim uygulayan özel iç sınıflardır ( bu makaleye bakın ). Dış sınıf, iç sınıfın tüm özel alanlarına ve yöntemlerine erişebilir.

Bu, her ikisinin de uygulamalarını açığa çıkarmadan bir model ve görünümü gibi iki sıkı bağlı sınıf oluşturmanıza olanak tanır. Başka bir örnek de bir koleksiyon ve yineleyicileridir.


4

Genel olarak, dosya başına bir sınıf olmalıdır. Her şeyi bu şekilde düzenlerseniz, bir sınıf aradığınızda, yalnızca o ada sahip dosyayı aramanız gerektiğini bilirsiniz.

Bunun istisnası, bir sınıfın bir veya daha fazla küçük yardımcı sınıf kullanılarak en iyi şekilde uygulandığı zamandır. Genellikle, bu sınıflar aynı dosyada bulunduğunda kodun izlenmesi en kolay yoldur. Örneğin, yöntem çağrıları arasında bazı verileri iletmek için küçük bir "tuple" sarmalayıcı sınıfına ihtiyacınız olabilir. Başka bir örnek, Runnable veya Callable'ı uygulayan 'görev' sınıflarıdır. O kadar küçük olabilirler ki, onları oluşturan ve çağıran ebeveyn sınıfıyla en iyi şekilde birleştirilirler.


4

Evet% 200 ,

Misal:

class A {
 void methodDeclaration() { System.out.println("!!!"); }
 }
 class B {
 public static void main(String[] args) {
new A().methodDeclaration();
    }
 }

2

Evet olabilir, ancak herhangi bir pakette yalnızca 1 genel sınıf olabilir, çünkü java derleyicisi, Genel sınıf adıyla aynı adı taşıyan .Class dosyasını oluşturur, bu nedenle, eğer bunlar 1'den fazla genel sınıfsa, seçilmesi zor olacaktır. Class dosyasının adının ne olması gerektiğini derleyici.



1

Sanırım ".java dosyası başına sadece bir STATİK OLMAYAN üst düzey genel sınıf olabilir". Değil mi?


Bunu burada cevaplamak yerine soru olarak sormalısınız.
Ashish Kumar

1

Bir singleton uygulamak istiyorsanız, bu, programınızda uygulamanın yürütülmesi boyunca bellekte yalnızca bir örnekle çalışan bir sınıftır, o zaman bir singleton gerçekleştirmenin yollarından biri, özel bir statik sınıfı bir public sınıfın içine yerleştirmektir. . Daha sonra iç özel sınıf, yalnızca özel örneğe erişim için genel yöntemi çağrıldığında kendini başlatır.

Bu wiki makalesine göz atın,

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

Konseptin çiğnenmesi biraz zaman alıyor.


1

Bir .java dosyasında, adı dosya ile aynı olan yalnızca bir genel üst düzey sınıf olabilir, ancak herkese aktarılabilen ve örneğin dış sınıfın alanlarına / yöntemlerine erişilebilen birkaç genel iç sınıf olabilir. : AlertDialog.Builder içinde ( 'kamu statik' ile değiştirilmiş) AlertDialog ( 'halk' tarafından değiştirilmiş)


1

Evet Bir .Java dosyasında birden fazla Sınıfınız olabilir. Ama bunlardan birini halka açık yaptınız. ve .java dosyasını genel sınıfın adıyla aynı adla kaydedin. .java dosyasını derlediğinizde, .java dosyasında tanımlanan her sınıf için ayrı .class dosyaları alacaksınız.

Bunun dışında bir .java dosyasında birden fazla sınıfı tanımlamak için çok fazla yöntem vardır.

  1. İç Sınıf kavramını kullanır.
  2. Anonim Sınıflar Kavramını Kullanın.

1

Evet ! .java dosyası yalnızca bir genel sınıf içerebilir.

Bu iki sınıfın herkese açık olmasını istiyorsanız, iki .java dosyasına konmaları gerekir: A.java ve B.java.


2
Ben senin yanıt eklenti şey daha 12 diğerleri yanıtlarından daha emin değilim
git

1

Evet, bir .java dosyasında birden fazla sınıfınız olabilir. En fazla biri halka açık olabilir. Diğerleri pakete özeldir. Özel veya korumalı OLAMAZ. Biri genel ise, dosya o sınıfın adına sahip olmalıdır. Aksi takdirde o dosyaya adı olarak HER ŞEY verilebilir.

Bir dosya içinde çok sayıda sınıfa sahip olmak, bu sınıfların aynı pakette olduğu anlamına gelir. Bu nedenle, bu paketin içindeki ancak bu dosyada olmayan diğer sınıflar da bu sınıfları kullanabilir. Dahası, bu paket içe aktarıldığında, sınıfın içe aktarılması da bunları kullanabilir.

Daha ayrıntılı inceleme için, benim blog yazısı ziyaret edebilirsiniz burada .


1
Stack Overflow'a hoş geldiniz! Burada daha önce ele alınmayan bilgiler hakkında açıklama yaptığınız için teşekkür ederim. Sahipliği beyan ederken ve ilgili bilgileri buraya eklerken blog yayınınıza atıfta bulunarak da iyi bir iş çıkardınız. Gelecekte bu siteye daha fazla katkıda bulunmayı seçerseniz (ve umarım yaparsınız), blogunuzdan alıntı yaparsanız gönderilerinizin iyi karşılanmaya devam etmesini sağlamak için bu makaleyi göz önünde bulundurun .
4castle

0

Bir dosyada yalnızca bir genel sınıf üst düzey sınıf olabilir. Bu public sınıfın sınıf adı dosyanın adı olmalıdır. Pek çok kamusal iç sınıfa sahip olabilir.

Tek bir dosyada birçok sınıfınız olabilir. Bir dosyadaki çeşitli sınıf görünürlüğü seviyeleri için sınırlar aşağıdaki gibidir:

Üst düzey sınıflar:
1 genel sınıf
0 özel sınıf
herhangi bir sayıda varsayılan / korumalı sınıf

İç sınıflar:
herhangi bir görünürlüğe sahip herhangi bir sayıda iç sınıf (varsayılan, özel, korumalı, genel)

Yanlışım varsa lütfen düzelt.


0

Evet yapabilir. Bununla birlikte, public sınıfların kaynak dosyayla aynı ada sahip olması gerektiğinden, .java dosyası başına yalnızca bir genel sınıf olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.