-
成員內部類
public class 外部類{
//成員內部類
public class 內部類{
public void fun(){
System.out.println(num); //內部類可以訪問外部類的成員
}
}
private int num = 0;
//外部類如果要訪問內部類的成員,則需要通過內部類的對象訪問
}
使用方式:
1.外部類使用內部類,主函數再使用外部類
2.通過new的方式
外部類.內部類 對象名 = new 外部類().new 內部類();
-
局部內部類
定義在方法內部的類,就是局部內部類,只有當前所屬方法才能使用。
//外部類
public class Outer{
public void methodOuter(){
//局部內部類
class Inner{
final int n = 0; // 2.則這個局部變量必須是final修飾的
public void methodInner(){
System.out.println(n); // 1.局部內部類要訪問所在方法中的局部變量
}
}
Inner inner = new Inner();
inner.methodInner();
}
}
public class MyMain{
public static void main(String[] args){
Outer outer = new Outer();
outer.methodOuter();
}
}
局部內部類要訪問所在方法中的局部變量,則這個局部變量必須是final修飾的。
原因:
1.new出來的對象在堆中
2.局部變量跟着方法走的,在棧內存當中
3.方法運行結束後,立刻出棧,局部變量就會消失
4.但是new出來的對象還在堆中,直到被回收
定義一個類的時候,修飾權限符的規則:
1.外部類:public、(default)
2.成員內部類:public、protected、(default)、private
3.局部內部類:無
-
匿名內部類(實現接口不用實現類)
如果接口的實現類(或者是父類的子類)只需要使用唯一一次,那麼這種情況下,就可以省略該類的定義,而改爲使用匿名內部類。
public interface MyInterFace{
public abstract void show();
}
public class Cat implements MyInterFace{
public void show(){
System.out.println("Hello");
}
}
public class MyMain{
public static void main(String[] args){
//一般情況
Cat cat = new Cat();
//或者 MyInterFace cat = new Cat();
}
}
匿名內部類實現
public interface MyInterFace{
public abstract void show();
}
public class MyMain{
public static void main(String[] args){
//沒有實現類Cat
MyInterFace cat = new MyInterFace(){
//覆蓋所有抽象方法
public void show(){
System.out.println("Hello");
}
}; //別忘了分號
}
}
或者不用對象名
public class MyMain{
public static void main(String[] args){
new MyInterFace(){
public void show(){
System.out.println("Hello");
}
}.show(); //一次性的方法調用
}
}