内部类
一般来说内部类分为四种:成员内部类,局部内部类,匿名内部类和静态内部类
- 成员内部类
成员内部类相当于类中的成员变量,可以无条件的访问外部类的所有成员属性和成员方法,外部类想要访问成员内部类的属性及方法需要先创建一个成员内部类对象,再通过指向这个对象的引用来访问;如果要创建成员内部类的对象,必须提供一个成员外部类对象
外部类只能被public和default权限修饰,内部类可以被任意访问权限修饰;如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问;成员内部类是依附外部类而存在的;生成的class文件为OutterClass$InnerClass.class
public class OutterClass {
InnerClass in = new InnerClass();
class InnerClass{
InnerClass(){
}
public void inf() {
}
int y = 0;
}
public InnerClass doit() {
in.y = 4;
return new InnerClass();
}
public static void main(String[] args) {
OutterClass out = new OutterClass();//提供一个成员外部类对象
OutterClass.InnerClass in = out.doit();
OutterClass.InnerClass in2 = out.new InnerClass();//通过成员外部类对象建立内部类对象
}
}
- 局部内部类
局部内部类是定义在一个方法或一个作用域内,局部内部类的访问仅限于方法内或者作用域内;局部内部类就像是方法内的一个局部变量,所以是不能被public、protected、private和static修饰符修饰的;局部内部类生成的Class文件为InnerClass3$1InnerClass2.class
public class OuterClass3 {
public static void main(String[] args) {
InnerClass3 in = new InnerClass3();
in.doit("hello");
}
}
interface OuterInterface{
}
class InnerClass3{
public OuterInterface doit(final String x) {
class InnerClass2 implements OuterInterface{//局部内部类
public InnerClass2(String s) {
s = x;
System.out.println(s);
}
}
return new InnerClass2("doit");
}
}
- 匿名内部类
一般事件监听会用匿名类实现。匿名内部类是不能有访问修饰符和static修饰符;一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。匿名内部类生成的class文件为OuterClass4$1.class
public class OuterClass4 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.doit().getValue();
}
}
class Outer{
public OuterInterface2 doit() {
return new OuterInterface2() {
private int i = 5;
public int getValue() {
System.out.println("输出:" + i);
return i;
}
};
}
}
interface OuterInterface2{
public int getValue();
}
- 静态内部类
静态内部类不需要依附外部类存在;内部类不能使用外部类的非static的成员变量和方法;静态内部类可以声明static成员,但是在非静态内部类中不可以声明static成员;静态内部类生成的class文件为StaticClass$Inner.class
public class StaticClass {
private int i = 3;
static class Inner {
void doitInner() {
//System.out.println(i); //静态内部类中不能调用外部类的非static成员变量
System.out.println("test");
}
}
public static void main(String[] args) {
new StaticClass.Inner();
}
}