内部类位置
位置分为成员位置与局部位置
public class InnerClass {
/**
* 成员位置
*/
public class InnerClassDemo{
}
public void method(){
/**
* 局部位置
*/
class InnerClassDemo{
}
}
}
创建内部类实例
成员内部类
创建成员内部类对象
public class TestClass {
public static void main(String[] args){
//创建成员内部类对象
Outer.Inner inner = new Outer().new Inner();
}
}
class Outer{
public class Inner{
}
}
创建静态成员内部类
public class TestClass {
public static void main(String[] args){
//创建成员内部类对象
Outer.Inner2 inner = new Outer.Inner2();
}
}
class Outer{
/**
* 静态内部类
*/
public static class Inner2{
}
}
局部内部类
创建局部内部类对象
public void method(){
class Inner{};
Inner inner = new Inner();
}
内部类访问特点
- 内部类可以直接访问外部类的成员变量
- 外部类访问内部类只能创建对象
- 静态内部类不能访问外部类的非静态成员变量
class Outer{
public void method(){
//外部类访问内部类成员变量
Inner2 i = new Inner2();
int num = i.num;
}
/**
* 静态内部类
*/
public class Inner2{
int num = 1;
}
}
局部内部类访问局部变量为什么要加final
public void method() {
final int num = 1;
class Inner {
void method(){
System.out.println(num);
}
}
因为局部变量存放在栈内存,局部内部类的实例存放在堆内存,当局部变量被释放而内部类实例没有被释放,就会出现问题,jdk8之后会自动加final
匿名内部类
是一个接口或抽象类的实现类或者子类的对象,本质是局部内部类。