局部内部类(内部类) - Java

局部内部类

说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。

LocalInnerClass.java

非常重要的几点!!

  1. 局部内部类本质还是一个类,该有的属性方法也都可以有。【举例a.见下文】
  2. 可以直接访问外部类的所有成员(成员=属性+方法),包含私有的。【举例a.见下文】
  3. 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final。【举例b.见下文】
  4. 作用域:仅仅在定义它的方法或代码块中。因为它的地位就是一个局部变量。
  5. 局部内部类 —> 访问 —> 外部类的成员 [访问方式:直接访问] 【举例a.】
  6. 外部类 —> 访问 —> 局部内部类的成员
    访问方式:创建对象,再访问(注意:必须在作用域内) 【举例c.】
  7. 外部其他类—不能访问----->局部内部类(因为局部内部类地位是一个局部变量)
  8. 如果外部类和局部内部类的成员重名时,默认遵循就近原则。如果在局部内部类想访问外部类的成员,则可以使用(外部类名.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.

局部内部类(内部类) - Java_第1张图片
添加了final之后就不可以继承了:
局部内部类(内部类) - Java_第2张图片

  • c.

局部内部类(内部类) - Java_第3张图片

//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
}

在这里插入图片描述

你可能感兴趣的:(Java,SE,java)