Spring Boot启用拦截器导致静态资源无法访问

内部类就是定义在另一个类里面的类。

一、内部类的基础

内部类直接在一个类中定义,可以直接访问该类的实例域。这是因为内部类的对象有一个隐式引用指向外部类对象,但这个引用在内部类中是不可见的。
如果内部类是公有的,可以使用如下语法从外部类外访问或者创建内部类:

1
2
3
4
5
6
7
class OuterClass {
public static void main() {
OuterClass outterClass = new OutterClass();
OuterClass.InnerClass innerClass = outterClass.new InnerClass();
...
}
}

而内部类则通过外部类编译时自动添加的access方法访问外部实例域。(这是有风险的,因为access方法是静态方法,任何包内的class都可以通过这个方法访问外部类的实例域)

虽然分为内部和外部类,但是在编译之后公有内部类就与外围类属于两个完全不同的类(当然他们之间还是有联系的)。对于一个名为OuterClass的外围类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。

在Java中内部类主要分为成员内部类、局部内部类、匿名内部类、静态内部类。

二、成员内部类

成员内部类也是最普通的内部类,它是外围类的一个成员,所以他是可以无限制的访问外围类的所有 成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。

在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

三、局部内部类

局部内部类是定义在外部类局部代码块的类。比如说:

1
2
3
4
5
6
7
8
9
10
11
12
class OuterClass {
...
public void test(final int temp) {
class InnerClass {
...
public void show() {
System.out.println("Temp is " + temp);
}
}
System.out.println("This is a innerclass test.");
}
}

这里的InnerClass只对test方法可见,对于OutterClass来说是不可见的,同时InnerClass还可以访问test中的final变量temp。

四、匿名内部类

只创建一个内部类对象而不命名就是匿名内部类。比如Android中常见的对组件添加响应器:

1
2
3
4
5
6
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
...
}
});

五、静态内部类

静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:

1、 它的创建是不需要依赖于外围类的。

2、 它不能使用任何外围类的非static成员变量和方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class OuterClass {
private int value;
private static String string = "this is in outerclass";

public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
//静态内部类的创建不需要依赖外部类
InnerClass1 innerClass1 = new InnerClass1();
//非静态内部类必须使用 OuterClass.new InnerClass 创建
InnerClass2 innerClass2 = outerClass.new InnerClass2();
}

/**
* 静态内部类
*/
public static class InnerClass1 {
//静态内部类可以有静态变量和方法
public static String str = "this is in static innerclass";
//静态内部类只能访问外部类的静态变量和方法
public void show() {
System.out.println(str);
System.out.println(string);
}
}

/**
* 非静态内部类
*/
class InnerClass2 {
//非静态内部类只能有非静态变量和方法
public String str = "this is in normal innerclass";
//非静态内部类可以访问任意外部变量和方法
public void show() {
System.out.println(str);
System.out.println(string);
System.out.println(value);
}
}
}