尚硅谷JavaSE基础

7.8.2 成员内部类

1. 普通内部类

class A {

 

       private int s;

 

       public class B {

 

              public void mb() {

                     s = 100; // 在普通内部类的方法中, 可以直接外部类的私有成员.

                     System.out.println("在内部类B中s=" + s);

              } 

 

       }

 

       public void ma() {

              B i = new B();

              i.mb();

       }

 

}

 

public class Test { 

 

       public static void main(String args[]){

              A o = new A();

              o.ma(); // 调用外部类的方法, 间接创建了内部类对象并调用了内部类对象的方法

       }

 

}

 

 

 

 

 

 

 

 

 

 

public class A {

 

       private int s = 111;

 

       public class B {

 

              private int s = 222;

 

              public void mb(int s) {

               System.out.println(s);        // 访问最近的形参值:333

               System.out.println(this.s);     // 访问本类当前对象的属性:222

               System.out.println(A.this.s);   // 访问外部类的当前对象的属性:111

              }

    }

}

 

public class Test {   

 

       public static void main(String args[]){

              A a = new A();

              A.B b = a.new B(); // 在测试类中创建普通内部类的对象需要使用外部类对象

              b.mb(333);

    }

}

 

 

 

2. 嵌套类

被static修饰的成员内部类就称为嵌套类.

 

class A {

 

       private int s;

 

       public static class B {

 

              public void mb() {

                     //s = 100; // 在嵌套类的方法中, 不可以直接外部类的非静态成员.

                     //System.out.println("在内部类B中s=" + s);

              } 

 

       }

 

       public void ma() {

              B i = new B();

              i.mb();

       }

 

}

 

public class Test { 

 

       public static void main(String args[]){

              A.B b = new A.B(); // 创建嵌套类对象, 不需要外部类的对象

       }

 

}

 

 

 

 

 

 

 

 

7.8.3 局部内部类

1. 概念

在方法体中声明的内部类就是局部内部类, 局部内部类的范围和局部变量类似.

2. 普通局部内部类

在方法中声明的内部类, 有类名, 使用和普通类类似.

 

public class Test {   

 

       public static void main(String args[]){

              class A {

                     public void test();

              };

              A a = new A();

              a.test();

    }

}

 

3. 匿名内部类

在方法中声明的内部类, 但是没有class关键字和具体类名, 称为匿名内部类, 因为没有类名, 所以必须在声明内部类的同时创建对象, 否则无法创建对象了.

所以匿名内部类的语法是 :

 

父类 引用 = new 父类(实参列表) {类体};

 

 

匿名内部类最常用用法是new 后面的类名是已经存在的类, 或抽象类, 或接口. 如果是抽象类或接口, 则匿名内部类类体中必须实现全部的抽象方法, 由此可见, 匿名内部类只能作为new后面的类或抽象或接口的子类存在, 但是没有类名, 所以通常在声明的时候就创建对象.

public interface A {

    public void a();

}

 

public class Test {   

 

       public static void main(String args[]){

              new A() {

            @Override

                     public void a() {

                System.out.println(“匿名内部类实现接口方法”);

}

              }.a(); // 打印输出内容…

    }

}