java中的內部類有四種:
1.靜態內部類:作為類的靜態成員,存在於某個類的內部。
靜態內部類雖然是外部類的成員,但是在未創建外部類的對象的情況下,可以直接創建靜態內部類的對象。靜態內部類可以引用外部類的靜態成員變量和靜態方法,但不能引用外部類的普通成員。
//靜態內部類的測試程序
public class Outter {
static int a=1;
int b=5;
static void test(){
System.out.println("外部類的靜態方法");
}
static class Inner{
public void test2(){
System.out.println("a的值為"+a);;//直接引用外部類的靜態成員變量
test();//直接引用外部類的靜態方法
//b++;試圖引用外部類的非靜態成員變量,不能通過編譯
System.out.println("靜態內部類的方法");
}
}
public static void main(String[] args) {
Inner in=new Inner();//靜態內部類的對象可以直接創建,無需先創建外部類的對象
in.test2();
}
}
2.成員內部類:作為類的成員,存在於某個類的內部。
成員內部類可以調用外部類的所有成員,但只有在創建了外部類的對象后,才能調用外部的成員。
public class Outter1 {
static int a=1;
int b=0;
public static void test1(){
System.out.println("外部類的靜態方法");
}
public void test2(){
System.out.println("外部類的非靜態方法");
}
class Inner{
public void test(){
System.out.println("在成員內部類的方法中");
test1();//調用外部類的靜態方法
test2();//調用外部類的非靜態方法
System.out.println(a+b);//訪問外部類的靜態成員變量和非靜態成員變量
}
}
public static void main(String[] args) {
//Inner in=new Inner();成員內部類的對象不能直接創建,會報錯
Outter1 out=new Outter1();//先創建外部類的對象
Inner in=out.new Inner();//注意:!!成員內部類的對象必須通過外部類的對象創建
}
}
3.局部內部類:存在於某個方法的內部。
局部內部類只能在方法內部中使用,一旦方法執行完畢,局部內部類就會從內存中刪除。
必須注意:如果局部內部類中要使用他所在方法中的局部變量,那么就需要將這個局部變量定義為final的。
public class Outter2 {
int a=10;
public void test(){
final int c=5;
System.out.println("在外部類的方法中");
class Inner{
int b=20;
void test1(){
System.out.println("局部內部類的方法中");
System.out.println(c);//注意:如果局部內部類中要使用他所在方法中的局部變量,那么就需要將這個局部變量定義為final的。
}
}
Inner inner=new Inner();
inner.test1();
}
public static void main(String[] args) {
Outter2 outter=new Outter2();
outter.test();
}
}
4.匿名內部類:存在於某個類的內部,但是無類名的類。
匿名內部類的定義與對象的創建合並在一起,匿名內部類一般通過如下形式定義,並且在定義的同時進行對象的實例化。
new 類或者接口的名字(){
//匿名內部類的主體,大括號中是匿名內部類的主體,這個主體就是類或者接口的實現,如果是類,那么匿名內部類是該類的子類,如果是接口,匿名內部類需要完成接口的實現。
}
class Person{
public void show(Message message){
message.show();
}
}
class Message{
public void show(){
System.out.println("在Message類中");
}
}
public class Outter3 {
public static void main(String[] args) {
Person person=new Person();
person.show(new Message(){
public void show(){
System.out.println("在匿名內部類中");
}
});
}
}
}
java中絕大多數情況下,類的訪問修飾符只有public和默認這兩種,但也有例外。靜態內部類和成員內部類還可以有protected和private兩種