當一個對象A離開對象B就沒有存在的意義,比如:棋子與棋盤,手機充電器與手機。
沒有棋盤,棋子就沒用,沒有手機,充電器就沒用。這個時候就可以使用內部類。
棋子類可以定義在棋盤中。
包含有內部類的類叫外部類,內部類可以訪問外部類屬性(除了靜態內部類,因爲靜態內部類產生於外部類之前)。
方法級別內部類(如下前兩例),可以使用方法級別的修飾符 比如:private、public等,訪問策略與類方法相同。
方法級別內部類編譯時產生於本類加上內部類個數的class文件
例:
靜態類內部類
public class InnerClass {
//靜態內部類,注意其實例化。。。
static class A{
void doit(int a){
System.out.println("InnerClass is working and numuber is:"+a);
}
}
public static void main(String[] args) {
//靜態內部類實例化
//與普通類的實例化差不多,可以吧InnerClass.A看做是一個類
InnerClass.A a= new InnerClass.A();
a.doit(3);
}
}
實例內部類
public class InnerClass {
//實例內部類,其實例化,必須先創建外部類實例,
class B{
void doit(){
System.out.println("實例內部類工作");
}
}
public static void main(String[] args) {
//實例內部類,必須要有棋盤,纔能有棋子
//先實例外部類,通過外部類對象新的對象類B
InnerClass innerClass =new InnerClass();
InnerClass.B b=innerClass.new B();
b.doit();
//也可示例如下
InnerClass.B b1=new InnerClass().new B();
b1.doit();
}
}
局部變量級內部類
public class InnerClass {
//局部變量級內部類,屬於某個方法,只在方法內有效,不能使用任何訪問修飾符,就跟局部變量一樣。
void method(){
class C{
void doit(){
System.out.println("局部變量級內部類");
}
}
//調用該類(只能在方法中使用)
C c = new C();
c.doit();
}
public static void main(String[] args) {
InnerClass innerClass1 =new InnerClass();
innerClass1.method();
}
}
這個寫法也會產生新的class文件
但這個寫法幾乎沒人用,只有一些職業筆試面試時好像會問到。
匿名內部類
我們給類起名是爲了什麼?
爲了可以使用這個類名創建多個實例,可是如果只需要一個實例呢?不就是不起名,直接用就好。
於是匿名內部類產生,匿名類需繼承於一個已有的父類或實現一個接口。
其實質是
class ??? extends XXXClass(){
//???(無名類)實現或重寫XXXClass方法、或些自己的方法
}
定義一個無名的類繼承或實現一個已有類,重寫或實現父類方法、或寫自己的方法。
之後就簡化成
new XXXClass(){
//方法
}
實現代碼如下public class AnonymousClass {
public void method(){
System.out.println("method類使用");
}
public static void main(String[] args) {
//匿名類也有構造方法,默認是調用父類無參構造方法,若父類沒有無參構造方法,則報錯
//使用父類方法
new AnonymousClass(){
}.method();
//重寫父類方法
new AnonymousClass(){
@Override
public void method() {
System.out.println("ss");
};
}.method();
//實現自己方法
new AnonymousClass(){
void me(){
System.out.println("sfsf");
}
}.me();
}
}