1》局部内部类
- 局部内部类是定义在外部类的局部位置,比如方法、代码块中,并且有类名。
- 可以直接访问外部类的所有成员,包括私有的。
- 不能添加访问修饰符,因为其地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final
- 作用域:仅仅在定义它的方法或代码块中
- 局部内部类本质上仍是一个类
- 外部其他类不能访问局部内部类(因为其作用域是在定义它的局部内)
- 作用域外不允许访问内部类
- 若外部类与局部内部类的成员重名时,遵循就近原则。若想访问外部类的成员,则可以使用(外部类名.this.成员)去访问。
- (外部类名.this)本质就是外部类的对象
- this本质就是this所在类的当前类对象
- 访问方式:
A、局部内部类访问外部类成员:直接访问
B、外部类访问局部内部类成员:先创建对象,再访问(注意:必须在作用域内)
public class InnerClassDemo {
public static void main(String[] args) {
Outer outer = new Outer();
outer.method2();
//Outer_InnerClass inner3 = new Outer_InnerClass();//作用域外不允许访问内部类
System.out.println("InnerClassDemo[outer]:"+outer);//com.Outer@66d3c617
}
}
class Outer{
private int n = 100;
public int num=2;
private void method1(){
System.out.println("我是外部类私有方法");
}
public void method2(){
final class Outer_InnerClass{//在局部位置,可以final修饰
private int num=35;
public void inner_mehtod1(){
//可以直接访问外部类所有成员
System.out.println("n="+n);//可以访问外部类私有属性
method1();//可以访问外部类私有方法
System.out.println("num="+num);//成员重名默认就近原则访问内部类变量
//Outer.this本质就是外部类的对象即哪个外部类对象调用了局部内部类所在方法method2,Outer.this就是哪个对象
System.out.println("num="+Outer.this.num);//成员重名(外部类名.this.成员)指定访问外部类成员
inner_mehtod2();
}
public void inner_mehtod2(){
System.out.println("Outer_InnerClass[this]:"+this);//com.Outer$1Outer_InnerClass@63947c6b
System.out.println("Outer_InnerClass[Outer.this]:"+Outer.this);//com.Outer@66d3c617
}
}
//外部类访问局部内部类成员:创建对象,再访问
final Outer_InnerClass inner = new Outer_InnerClass();//作用域仅仅在定义的方法内
inner.inner_mehtod1();//本质仍是类
System.out.println("inner:"+inner);//com.Outer$1Outer_InnerClass@63947c6b
System.out.println("Outer[this]"+this);//com.Outer@66d3c617
}
//Outer_InnerClass inner = new Outer_InnerClass();//作用域外不允许访问内部类
}