1、靜態(tài)內(nèi)部類(static inner classes):
最簡單的內(nèi)部類。只能訪問外部類的靜態(tài)成員變量與靜態(tài)方法。生成靜態(tài)內(nèi)部類對象的方法:OuterClass.InnerClass inner = new OuterClass.InnerClass();
1.1、相關(guān)使用例子:
靜態(tài)內(nèi)部類:
class StaticInner{
private static int a = 1;
/**
* 靜態(tài)內(nèi)部類
* 生成的類名:StaticInner$InnerClass
*/
public static class InnerClass{
//靜態(tài)內(nèi)部類可以聲明靜態(tài)的成員變量,其他的內(nèi)部類不可以
private static int b = 1;
public void execute(){
//靜態(tài)內(nèi)部類只能訪問靜態(tài)程序
System.out.println(a + b);
}
}
}
main方法中使用:
public static void main(String[] args) {
//創(chuàng)建靜態(tài)內(nèi)部類
StaticInner.InnerClass innerClass = new StaticInner.InnerClass();
innerClass.execute();
}
2、成員內(nèi)部類(member inner classes):
成員內(nèi)部類可以訪問外部類的靜態(tài)與非靜態(tài)的方法和成員變量。
生成成員內(nèi)部類對象的方法:OuterClass.InnerClass inner = new OuterClass().new InnerClass();
在局部內(nèi)部類中訪問外部類的成員變量的方法:OuterClass.this.a;
2.1、相關(guān)使用例子:
成員內(nèi)部類:
class MemberInner{
private int a = 1;
public void execute(){
//在外部類中創(chuàng)建成員內(nèi)部類
InnerClass innerClass = this.new InnerClass();
}
/**
* 成員內(nèi)部類
*/
public class InnerClass{
//內(nèi)部類可以創(chuàng)建與外部類同名的成員變量
private int a = 2;
public void execute(){
//this引用的是內(nèi)部類
System.out.println(this.a);
//在內(nèi)部了中使用外部類的成員變量的方法
System.out.println(MemberInner.this.a);
}
}
}
在main方法中使用:
public static void main(String[] args) {
//創(chuàng)建成員內(nèi)部類
MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();
innerClass.execute();
}
3、局部內(nèi)部類(local inner classes):
類似于局部變量,不能定義為public,protected,private或者static類型。
定義方法中,只能方法中聲明為final類型的變量。
3.1、相關(guān)使用例子:
局部內(nèi)部類:
class LocalInner{
public void execute(){
final int a = 1;
/**
* 創(chuàng)建局部內(nèi)部類
*/
class InnerClass{
public void execute(){
System.out.println("LocalInner Class");
//局部內(nèi)部類只能訪問final類型的變量
System.out.println(a);
}
}
//只能在所在方法區(qū)域創(chuàng)建
new InnerClass().execute();
}
}
在main方法中使用:
public static void main(String[] args) {
//外部不能直接創(chuàng)建局部內(nèi)部類
LocalInner localInner = new LocalInner();
localInner.execute();
}
4、匿名內(nèi)部類(anonymous inner classes):
匿名內(nèi)部類沒有類名,沒有class關(guān)鍵字也沒有extends和implements等關(guān)鍵字修飾。
匿名內(nèi)部類會隱式地繼承一個父類或?qū)崿F(xiàn)一個接口。
4.1、相關(guān)使用例子:
public static void main(String[] args) {
AnonymousInnerClassTest test = new AnonymousInnerClassTest();
/**
* 創(chuàng)建匿名內(nèi)部類
* 生成的類名:AnonymousInnerClassTest$1
*/
test.print(new Date(){
//重寫toString()方法
@Override
public String toString() {
return "Hello world.";
}
});
JButton button = new JButton();
/**
* 創(chuàng)建匿名內(nèi)部類
* 該匿名內(nèi)部類實(shí)現(xiàn)ActionListener接口
* 生成的類名:AnonymousInnerClassTest$1
*/
button.addActionListener(new ActionListener(){
//實(shí)現(xiàn)接口中的方法
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("使用匿名內(nèi)部類實(shí)現(xiàn)ActionListener接口");
}
});
}
public void print(Date date){
System.out.println(date);
}