局部内部类
说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。
LocalInnerClass.java
非常重要的几点!!
- 局部内部类本质还是一个类,该有的属性方法也都可以有。【举例a.见下文】
- 可以直接访问外部类的所有成员(成员=属性+方法),包含私有的。【举例a.见下文】
- 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final。【举例b.见下文】
- 作用域:仅仅在定义它的方法或代码块中。因为它的地位就是一个局部变量。
- 局部内部类 —> 访问 —> 外部类的成员 [访问方式:直接访问] 【举例a.】
- 外部类 —> 访问 —> 局部内部类的成员
访问方式:创建对象,再访问(注意:必须在作用域内) 【举例c.】 - 外部其他类—不能访问----->局部内部类(因为局部内部类地位是一个局部变量)
- 如果外部类和局部内部类的成员重名时,默认遵循就近原则。如果在局部内部类想访问外部类的成员,则可以使用(外部类名.this.成员)去访问【举例d.】
- 举例
- a.
class Outer02 {
private int n1 = 100;
private void m2() {}
public void m1() {
class Inner02 { //局部内部类本质还是一个类,该有的方法也都可以有
public void f1() {
//直接访问外部类的私有属性
System.out.println("n1 = " + n1);
//直接访问外部类的私有方法
m2();
}
}//end Inner02
}
}//end Outer02
- b.
添加了final之后就不可以继承了:
- c.
//LocalInnerClass.java
public class LocalInnerClass {
public static void main(String[] args) {
Outer02 outer02 = new Outer02();
outer02.m1();
}
}
class Outer02 {
private int n1 = 100;
private void m2() {
System.out.println("Outer02-m2");
}
public void m1() {
class Inner02 {
public void f1() {
System.out.println("n1 = " + n1);
m2();
}
}
Inner02 inner02 = new Inner02();
inner02.f1();
}//end m1
}//end Outer02
- d.
其中最重要的是下面两句
System.out.println("就近原则 n1 = "+n1);
System.out.println("外部类Outer02的 n1 = "+Outer02.this.n1);
Outer02.this 本质就是外部类的对象,即哪个对象调用了m1, Outer02.this就是哪个对象。这里通过打印hashCode判断
public class LocalInnerClass {
public static void main(String[] args) {
Outer02 outer02 = new Outer02();
outer02.m1();
System.out.println("outer02的 hashCode = "+outer02);
}
}
class Outer02 {
private int n1 = 100;
public void m1() {
class Inner02 {
private int n1 = 800;
public void f1() {
System.out.println("就近原则 n1 = "+n1);
System.out.println("外部类Outer02的 n1 = "+Outer02.this.n1);
System.out.println("Outer02.this的 hashCode = "+Outer02.this);
}
}
Inner02 inner02 = new Inner02();
inner02.f1();
}//end m1
}