概述
-
内部类即类中类,至此类中不仅可存在属性方法代码块,亦可存在类尔。
-
内部类分为:成员内部类、局部内部类、匿名内部类、静态内部类。
-
应用现有较少,但实际代码中可能会出现其内容,需理解看懂。
-
内部类亦为类,编译时亦会出现class文件,但其class文件名将为:外部类名$内部类名.class 格式。
各类内部类详解
成员内部类
-
如类声明相同,但其存在于其他一类中,内部类所在类称为外部类。
//A即为外部类,B即为内部类 public class A{ class B{} }
-
内部类可无条件访问外部类中成员属性与方法,亦包括私有或静态成员。
-
若内外类成员重名,默认访问内部类成员。若望访问外部成员,需使用类名与this关键字进行定位:
public class A{ int a; boolean b; class B{ int c = A.this.a; boolean d = A.this.b; } }
-
外部类若希望访问内部类中成员,需创建其内部类对象方可访问。
public class A{ int b = new B().a; class B{ int a; } }
-
在内外部类之外,若希望使用内部类需首先创建外部类对象,或在外部类中使用方法的方式获取内部类对象:
public class A{ class B{} public B getB(){ return new B(); } } public class Test{ public static void main(String[] args){ A.B bObject = new A().new B(); //根据外部类获得内部类 A.B bObject2 = new A().getB(); //根据外部类方法获得内部类 } }
-
成员内部类不仅像常规类一样仅使用public修饰,亦可使用其他多种访问修饰。因其类似外部类中一成员,故将其作为一成员看待。
局部内部类
-
成员内部类为:作为一成员存在于外部类中,其性质更类似一类之成员。局部内部类存在于代码块中在,方法或构造代码块中亦可存在,其生命周期并不属于一类,而属于一方法。
-
成员内部类亦可存在继承等逻辑:
public class A{} public class B{ public void aaa(){ class C extends A{} //此类位于方法中,且继承类A } }
-
局部内部类仅为一变量尔,不可使用访问修饰符与静态修饰符。
匿名内部类
-
在进行传参或赋值时,经常出现对象类型变量,此变量一般由类创建而赋值于引用中,此对象内容被类控制,无法更改。
-
匿名内部类可在创建对象时,对对象内容进行定义:
A a = new A(){ int a = 10; int b = 20; };
-
若需创建抽象类对象时,其中抽象方法并无实现即可使用匿名内部类在创建时对抽象方法进行复写。
-
匿名内部类不可使用访问修饰符与静态修饰符,且不存在构造方法。匿名内部类使用灵活,可在逻辑当时实现功能,但零零散散不易维护。
静态内部类
-
静态内部类与成员内部类同处于类中,但其class关键字前存在static关键字。
class A{ static class B{} }
-
静态内部类之创建不必需要外部类对象,可直接通过外部类名定位内部类而创建,与静态成员使用方式略同:
A.B b = new A.B();