在本教程中,您將借助示例學習嵌套的靜態(tài)類。您還將了解靜態(tài)類與內(nèi)部類之間的區(qū)別。
如之前的教程所述,我們可以在Java的另一個類中擁有一個類。這樣的類稱為嵌套類。在Java中,嵌套類有兩種類型:
嵌套的非靜態(tài)類(內(nèi)部類)
嵌套的靜態(tài)類。
在上一教程中,我們已經(jīng)討論了內(nèi)部類。如果您想了解內(nè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)嵌套類與外部類相關聯(lián)。
要訪問靜態(tài)嵌套類,我們不需要外部類的對象。
class Animal {
//內(nèi)部類
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)嵌套類與外部類相關聯(lián)。這就是為什么靜態(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()。
現(xiàn)在,如果我們嘗試使用對象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)頂級類,因此會出現(xiàn)錯誤。