1、成员内部类

  • 可以访问外部类的所有资源、本身内部不能有静态属性(本身就需要外部类的实例化)
  • 通过类.this.变量名。调用外部类相同的方法或者属性
 ExternalClass.this.a
  • 创建成员内部类实例时,外部类的实例必须已经存在。
  ExternalClass externalClass = new ExternalClass();
InnerClass innerClass = externalClass.new InnerClass();//创建内部类对象
package com.zheng.demo10;

public class ExternalClass {
String name = "hello";
private int a = 666;

public void displayExternal() {
System.out.println("我是外部类");
}


//内部类
class InnerClass {
private int a= 888;

public void didplayInner() {
System.out.println("我是内部类");
}

//调用外部类的私有属性
public void show() {
System.out.println("我拿了内部类的私有属性:"+a);
System.out.println("我拿了外部类的私有属性:" + ExternalClass.this.a);
}

//调用外部类的方法
public void show1() {
displayExternal();
}


}


public static void main(String[] args) {
ExternalClass externalClass = new ExternalClass();
InnerClass innerClass = externalClass.new InnerClass();//创建内部类对象
innerClass.didplayInner();
innerClass.show();
innerClass.show1();
}
}

2、静态内部类

用static定义

  • 只能访问外部类的静态资源
  • 不依赖外部类生成对象
  • 通过类.属性名调用外部属性
        InnerClass innerClass = new InnerClass();//创建内部类对象
package com.zheng.demo10;

public class ExternalClass {
String name = "hello";
private static int a = 666;

public static void displayExternal() {
System.out.println("我是外部类");
}


//内部类
public static class InnerClass {
private static int a=9999;

public void didplayInner() {
System.out.println("我是静态内部类");
}

//调用外部类的私有属性
public void show() {
System.out.println("拿了静态内部类的私有熟属性:"+a);
System.out.println("我拿了外部类的静态私有属性:" +ExternalClass.a);
}

//调用外部类的方法
public void show1() {
displayExternal();
}


}


public static void main(String[] args) {

InnerClass innerClass = new InnerClass();//创建内部类对象
innerClass.didplayInner();
innerClass.show();
innerClass.show1();
}
}

成员内部类 | 静态内部类 | 局部内部类 | 匿名内部类_外部类

3、局部内部类

定义在外部类的方法中的类,只在该方法内有用

  • 不能使用访问控制符(publuc 、protected、default、private)
  • 不能用static修饰
package com.zheng.demo10;

public class ExternalClass {
String name = "hello";
private int a = 666;

public void display() {

class InnerClass {//局部内部类
double b = 520.1314;
public void show() {
System.out.println("访问外部属性:" + a);
System.out.println("访问内部属性:" + b);
}

}
//在方法体内使用
InnerClass innerClass = new InnerClass();
innerClass.show();
}


public static void main(String[] args) {
ExternalClass externalClass = new ExternalClass();
externalClass.display();
}
}

成员内部类 | 静态内部类 | 局部内部类 | 匿名内部类_内部类_02

4、匿名内部类

形式为:new <类或接口> <类的主体>

  • 在匿名内部编写的方法对外不可见。没有自身的对象调用。通过继承一个接口实例化的对象不能调用子类独有的方法。
  • 没有构造器
  • 不能有访问修饰符合static修饰符

实现过程:
1、继承一个接口。2、重写接口方法

package com.zheng.demo10;

public class ExternalClass {
public static void main(String[] args) {
A a = new A() {
public void show() {
System.out.println("我是匿名内部类");
}
};

a.show();
}

}

interface A {
public void show();
}

成员内部类 | 静态内部类 | 局部内部类 | 匿名内部类_私有属性_03