成员内部类
定义于一个类的的内部,可以无条件访问外部类的所有成员属性和方法(包括静态成员和private成员)
而外部类想访问内部类的成员就需要先船舰成员内部类的对象,在通过对象引用来访问。
public class TestStatic {
public final int number; //成员字段可以在构造器中赋值
private static final int id; //静态成员字段可以在静态代码块中赋值
static {
id = 1;
}
public TestStatic() {
number = 1;
}
private void tostr(){
System.out.println("私有方法");
new Tes().to(); //外部类访问内部类需要实例化对象来访问。
}
class Tes{ //成员内部类,可以访问当前类下的private修饰的字段
private int id = 0; //如果与外部类重名,默认为内部类
public void to(){
System.out.println(id); //内部类的id
System.out.println(TestStatic.id); //外部类的id
System.out.println(TestStatic.this.id); //外部类的id
tostr(); //可以直接调用private修饰的方法
}
}
}
成员内部类依附于外部类存在,如果想创建内部类的对象,需要先存在一个外部类的对象。
public class Test {
public static void main(String[] args) {
//第一种方式:
Outter outter = new Outter();
Outter.Inner inner = outter.new Inner(); //必须通过Outter对象来创建
//第二种方式:
Inner inner1 = new Outter().new Inner();
//或者
Outter.Inner = new Outter().new Inner()
}
}
局部内部类
定义在一个方法内或者一个作用域内,类似局部变量,该内部类只能在该方法内或该作用域内访问
就像局部变量一样,无法使用static、四种访问修饰符
静态内部类
定义在一个类的内部,但多了修饰符static。不依赖外部类,可以直接创建内部类对象,只能使用外部类static成员变量和方法。因为在没有外部类的情况下可以创建内部类的对象,此时外部类的非static成员还不存在。
问题
为什么局部内部类和匿名内部类只能访问局部final变量?
public class ThreadTest {
public void function(String a) {
a="b"; //jdk1.8后会默认为final String a,即使你不写,但如果你重新给a赋值,就会报错
new Thread(){
@Override
public void run() {
System.out.println(a);
}
}.start();
}
public static void main(String[] args) {
new ThreadTest().function("a");
}
}