一、內部類
將類定義在其他類的內部(成員位置或局部位置),此種方式定義的類稱之爲內部類。定義在成員位置的類稱之爲成員內部類。定義在局部位置的類稱之爲局部內部類。
成員內部類可以使用成員修飾符,如public、private、static等等。它也是個類,可以繼承、實現接口等。
內部類可以使用外部的成員,包括私有的。但是外部類要使用內部類的成員,必須要創建內部類對象。
創建內部類對象格式:
外部類類名.內部類類名 變量 = new 外部類().new 內部類();
例:
//外部類
public class Outer {
//成員內部類
class Inner{
public Inner(){
System.out.println("我是成員內類的構造方法!");
}
//成員內部類方法
public void innerFun(){
System.out.println("我是成員內部類的方法!");
}
}
}
//定義測試類
class Test{
public static void main(String[] args){
//創建成員內部類對象
Outer.Inner oi = new Outer().new Inner();
//調用內部類方法
oi.innerFun();
}
}
局部內部類,要想使用其中的成員,要在成員方法中創建局部內部類對象,然後調用其成員。
例:
//外部類
public class Outer {
//成員方法
public void fun(){
//局部內部類
class Inner{
public Inner(){
System.out.println("我是局部內部類的構造方法!");
}
//局部內部類的方法
public void sectionInnerFun(){
System.out.println("我是局部內部類的成員方法!");
}
}
//創建局部內部類對象
Inner in = new Inner();
//調用其成員方法
in.sectionInnerFun();
}
}
//定義測試類
class Test{
public static void main(String[] args){
//創建外部類對象,調用成員方法即可
new Outer().fun();
}
}
二、匿名內部類
匿名內部類是局部內部類的一種,是創建某個類型的子類對象的便捷方式,其不能有構造方法。
格式:
new 接口或父類(){
重寫抽象方法
};
例:
//定義“人”類接口
public interface Person {
//定義抽象方法eat
public void eat();
//定義抽象方法 sleep
public void sleep();
}
public class MyTest {
public static void main(String[] args){
//使用匿名內部類方式創建實現類對象,以下是多態體現,父類引用指向子類對象(new 關鍵開始到分號結束 爲子類對象)
Person p = new Person(){
//實現接口中的所有抽象方法
@Override
public void eat() {
System.out.println("吃飯!");
}
@Override
public void sleep() {
System.out.println("睡覺!");
}
};
//調用重寫後的方法
p.eat();
p.sleep();
}
}