在本教程中,您將借助示例學習嵌套的靜態(tài)類。您還將了解靜態(tài)類與內部類之間的區(qū)別。
如之前的教程所述,我們可以在Java的另一個類中擁有一個類。這樣的類稱為嵌套類。在Java中,嵌套類有兩種類型:
嵌套的非靜態(tài)類(內部類)
嵌套的靜態(tài)類。
在上一教程中,我們已經討論了內部類。如果您想了解內部類,請訪問Java嵌套類。
在本教程中,我們將學習嵌套靜態(tài)類。
我們使用關鍵字static使我們的嵌套類靜態(tài)化。
注意:在Java中,僅允許嵌套類為靜態(tài)。
與常規(guī)類一樣,靜態(tài)嵌套類可以同時包含靜態(tài)和非靜態(tài)字段和方法。例如,
Class Animal { static class Mammal { // Mammal類的靜態(tài)和靜態(tài)成員 } // Animal類的成員 }
靜態(tài)嵌套類與外部類相關聯。
要訪問靜態(tài)嵌套類,我們不需要外部類的對象。
class Animal { //內部類 class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } //靜態(tài)類 static class Mammal { public void displayInfo() { System.out.println("I am a mammal."); } } } class Main { public static void main(String[] args) { //創(chuàng)建外部類的對象 Animal animal = new Animal(); //非靜態(tài)類的對象創(chuàng)建 Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); //靜態(tài)嵌套類的對象創(chuàng)建 Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); } }
輸出結果
I am a reptile. I am a mammal.
在上面的程序中,我們在Animal類中有兩個嵌套的Mammal和Reptile類。
為了創(chuàng)建非靜態(tài)類Reptile的對象,我們使用了
Animal.Reptile reptile = animal.new Reptile()
為了創(chuàng)建靜態(tài)類Mammal的對象,我們使用了
Animal.Mammal mammal = new Animal.Mammal()
在Java中,靜態(tài)嵌套類與外部類相關聯。這就是為什么靜態(tài)嵌套類只能訪問外部類的類成員(靜態(tài)字段和方法)的原因。
讓我們看看如果嘗試訪問外部類的非靜態(tài)字段和方法會發(fā)生什么。
class Animal { static class Mammal { public void displayInfo() { System.out.println("I am a mammal."); } } class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } public void eat() { System.out.println("I eat food."); } } class Main { public static void main(String[] args) { Animal animal = new Animal(); Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); mammal.eat(); } }
輸出結果
Main.java:28: error: cannot find symbol mammal.eat(); ^ symbol: method eat() location: variable mammal of type Mammal 1 error compiler exit status 1
在上面的示例中,我們在Animal類中創(chuàng)建了一個非靜態(tài)方法eat()。
現在,如果我們嘗試使用對象mammal訪問eat(),則編譯器將顯示錯誤。
這是因為mammal是靜態(tài)類的對象,因此我們無法從靜態(tài)類訪問非靜態(tài)方法。
如上所述,只有嵌套類可以是靜態(tài)的。我們不能有靜態(tài)的頂級類。
讓我們看看如果嘗試使頂級類靜態(tài)化會發(fā)生什么。
static class Animal { public static void displayInfo() { System.out.println("I am an animal"); } } class Main { public static void main(String[] args) { Animal.displayInfo(); } }
輸出結果
Main.java:1: error: modifier static not allowed here static class Animal { ^ 1 error compiler exit status 1
在上面的示例中,我們嘗試創(chuàng)建一個靜態(tài)類Animal。由于Java不允許使用靜態(tài)頂級類,因此會出現錯誤。