局部内部类
说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。
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
}




















