在Java中,就像方法一樣,類的變數也可以將另一個類作為它的成員。 在Java中允許在一個類中編寫另一個類。 在其中編寫的類稱為嵌套類,而保存內部類的類稱為外部類。
語法
以下是編寫嵌套類的語法。 這裏,類OuterDemo
是外部類,而類InnerDemo
是嵌套類。
class OuterDemo {
class InnerDemo {
}
}
嵌套類分為兩種類型 -
- 非靜態嵌套類 - 這些是類的非靜態成員。
- 靜態嵌套類 - 這些是類的靜態成員。
1. 內部類(非靜態嵌套類)
內部類是Java中的安全機制。 我們知道一個類不能與private
訪問修飾符關聯,但如果將該類作為其他類的成員,那麼內部類可以變為private
。 這也用於訪問類的私有成員。
內部類有三種類型,具體取決於定義它們的方式和位置。它們分別是 -
- 內部類
- 方法-局部內部類
- 匿名內部類
1.1. 內部類
創建內部類非常簡單,只需要在一個類中編寫一個類。 與類不同,內部類可以是私有的,當將內部類聲明為private
,就無法從類外部的對象訪問它。
以下是創建內部類並訪問它的程式。 在示例中,將內部類設為private
,並通過方法訪問類。
示例
class OuterDemo {
int num;
// 內部類
private class InnerDemo {
public void print() {
System.out.println("This is an inner class");
}
}
// 從內部方法訪問他的內部類
void display_Inner() {
InnerDemo inner = new InnerDemo();
inner.print();
}
}
public class Myclass {
public static void main(String args[]) {
// 實例化外部類
OuterDemo outer = new OuterDemo();
// 訪問 display_Inner()方法。
outer.display_Inner();
}
}
在示例中OuterDemo
是外部類,InnerDemo
是內部類,display_Inner()
是在其中實例化內部類的方法,並且這個方法是從main
方法調用的。
編譯並執行上述程式,將得到以下結果 -
This is an inner class.
訪問私有成員
如前所述,內部類也用於訪問類的私有成員。 假設,一個類想要讓私有成員訪問,可從內部類中的方法返回私有成員。
要實例化內部類,最初必須實例化外部類。 此後,使用外部類的對象訪問內部類,以下是實例化內部類的方法。
OuterDemo outer = new OuterDemo();
OuterDemo.InnerDemo inner = outer.new InnerDemo();
以下程式顯示如何使用內部類訪問類的私有成員。
class OuterDemo {
// 外部類的私有變數
private int num = 175;
// 內部類
public class InnerDemo {
public int getNum() {
System.out.println("This is the getnum method of the inner class");
return num;
}
}
}
public class My_class2 {
public static void main(String args[]) {
// 實例化外部類
OuterDemo outer = new OuterDemo();
// 實例化內部類
OuterDemo.InnerDemo inner = outer.new InnerDemo();
System.out.println(inner.getNum());
}
}
編譯並執行上述程式,將得到以下結果 -
This is the getnum method of the inner class: 175
1.2. 方法-局部內部類
在Java中,可以在方法中編寫一個類,這將是一個局部類型。與局部變數一樣,內部類的範圍在方法中受到限制。
方法局部內部類只能在定義內部類的方法中實例化。 以下程式顯示了如何使用方法局部內部類。
示例
public class Outerclass {
// 外部類的實例方法
void my_Method() {
int num = 23;
// 方法局部內部類
class MethodInnerDemo {
public void print() {
System.out.println("This is method inner class "+num);
}
} // end of inner class
// 訪問內部類
MethodInnerDemo inner = new MethodInnerDemo();
inner.print();
}
public static void main(String args[]) {
Outerclass outer = new Outerclass();
outer.my_Method();
}
}
編譯並執行上述程式,將得到以下結果 -
This is method inner class 23
1.3. 匿名內部類
聲明沒有類名的內部類稱為匿名內部類。 在匿名內部類中,同時聲明並實例化內部類。 通常,只要需要覆蓋類或介面的方法,就會使用它們。 匿名內部類的語法如下 -
語法
AnonymousInner an_inner = new AnonymousInner() {
public void my_method() {
........
........
}
};
以下程式顯示如何使用匿名內部類覆蓋類的方法。
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner() {
public void mymethod() {
System.out.println("This is an example of anonymous inner class");
}
};
inner.mymethod();
}
}
編譯並執行上述程式,將得到以下結果 -
This is an example of anonymous inner class
以同樣的方式,可以使用匿名內部類覆蓋具體類的方法以及介面。
2. 匿名內部類作為參數
通常,如果方法接受介面,抽象類或具體類的對象,那麼可以實現介面,擴展抽象類,並將對象傳遞給方法。如果它是一個類,那麼可以直接將它傳遞給方法。
在這三種情況下,都可以將匿名內部類傳遞給方法。 以下是將匿名內部類作為方法參數傳遞的語法 -
obj.my_Method(new My_Class() {
public void Do() {
.....
.....
}
});
以下程式演示如何將匿名內部類作為方法參數傳遞。
// 定義介面
interface Message {
String greet();
}
public class Myclass {
// 接受介面 Message 對象的方法
public void displayMessage(Message m) {
System.out.println(m.greet() +
", This is an example of anonymous inner class as an argument");
}
public static void main(String args[]) {
// 實例化類
Myclass obj = new Myclass();
// 傳遞匿名內部類作為參數
obj.displayMessage(new Message() {
public String greet() {
return "Hello";
}
});
}
}
編譯並執行上述程式,將得到以下結果 -
Hello, This is an example of anonymous inner class as an argument
3. 靜態嵌套類
靜態內部類是嵌套類,它是外部類的靜態成員。 可以使用其他靜態成員在不實例化外部類的情況下訪問它。 就像靜態成員一樣,靜態嵌套類無法訪問外部類的實例變數和方法。 靜態嵌套類的語法如下 -
class MyOuter {
static class Nested_Demo {
}
}
實例化靜態嵌套類與實例化內部類略有不同。 以下程式顯示了如何使用靜態嵌套類。
示例
public class Outer {
static class Nested_Demo {
public void my_method() {
System.out.println("This is my nested class");
}
}
public static void main(String args[]) {
Outer.Nested_Demo nested = new Outer.Nested_Demo();
nested.my_method();
}
}
編譯並執行上述程式,將得到以下結果 -
This is my nested class