java内部类总结
(1) 在方法间定义的非静态内部类:
● 外围类和内部类可互相访问自己的私有成员。
● 内部类中不能定义静态成员变量。
在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象
(2) 在方法间定义的静态内部类:
● 只能访问外部类的静态成员。
静态内部类没有了指向外部的引用
(3) 在方法中定义的局部内部类:
● 该内部类没有任何的访问控制权限
● 外围类看不见方法中的局部内部类的,但是局部内部类可以访问外围类的任何成员。
● 方法体中可以访问局部内部类,但是访问语句必须在定义局部内部类之后。
● 局部内部类只能访问方法体中的常量,即用final修饰的成员。
(4) 在方法中定义的匿名内部类:
● 没有构造器,取而代之的是将构造器参数传递给超类构造器
当你只需要创建一个类的对象而且用不上它的名字时,使用匿名内部类可以使代码看上去简洁清楚。
class A {
private interface inter {
}
public int i = 0;
public B b = new B();
/**
* 非静态内部类 一个内部类对象可以访问创建它的外部类对象的内容 Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。
* 这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之 外向要创建内部类对象必须先创建其外部类对象的原因
*/
protected class B {
// private int value=i+1;
// 防止外部类变量重名
private int i = A.this.i + 1;
// 内部类不能有static变量,编译不过
static int k = 0;
public void fun() {
System.out.println(i);
// System.out.println(value);
}
}
/**
* 静态内部类 区别就在于非静态内部类没有了指向外部的引用
*/
protected static class C {
public void fun() {
// static int i;
// System.out.println(i);
}
}
/**
* 局部内部类 能够访问函数的参数和类成员变量
*/
public void fun(int j) {
class D {
private int value = j;
public void fun() {
System.out.println(i);
System.out.println(value);
}
}
new D().fun();
}
/**
* 匿名内部类 能够访问函数的参数和类成员变量
*/
public void fun1(int j) {
new inter() {
public void fun() {
System.out.println(j);
System.out.println(i);
}
}.fun();
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
// a.b.fun();
a.fun1(100);
}
}