最近写代码时,遇到了一些类使用错误的问题,重新研究了下java的各种类,发现细节还是很多的。
在java中主要有两种类类型:文件类、内部类。

一、文件类(也叫外部类)

类名和.java文件同名的类

// A.java
class A{}

二、内部类(嵌套类)

内部类包括: 成员类、局部类、匿名类。

2.1 局部类

可使用isLocalClass()来判断是否是局部类。
a、在构造方法中定义或在方法块中定义的类。
b、只能被当前方法块中创建
c、无法被static 关键字修饰
如下面代码中的H、J类

// A.java
class A{
A(){
class H{}
}

void test(){
class J{}
}
}

2.2 成员类

可使用isMemberClass()判断是否是成员类。
a、在文件类中定义
b、不属于局部类的类
c、只能被其所在java文件中的所有非静态类创建,而不能被其它java文件中的类创建

如下面代码中的B类

// A.java
class A{
class B{} // 成员类
static class C{} // 静态嵌套类
}

关于c点的代码例子:

// A.class
public class A {
public class ss{
}
public static class s{
ss s = new ss(); // 错误,内部类不能被静态的内部类创建
}
}

// B.class
public class B{
A.ss s = new A.ss(); // 错误,A的内部类不能被其它java文件中的类创建
}

2.3 静态的成员类

可使用isMemberClass()判断是否是成员类。
a、使用static修饰的成员类
静态的成员类可以被内部类创建,也可以被其它java文件中的类创建,使用public静态成员类可以有效内存泄漏的情况,如果是private吓死的静态成员类是无法规避内存泄漏的风险的。

// A.java
class A{
class B{// 成员类
C c = new C();
}
static class C{} // 静态成员类
}

// G.java{
A.C ac = new A.c();
}

2.4 匿名类

可使用isAnonymousClass()判断是否是匿名类。
a、没有类名的局部类或局部类
b、无法被static、final等关键字修饰

//A.java
class A{
interface Inf{
void callback();
}

Inf inf = new Inf{ // 这个便是匿名类,一般是接口,或抽象类的直接实现
@Override void callbak(){
}
};

void test(){
Inf ing = new Inf{ // 这个便是匿名类,一般是接口,或抽象类的直接实现
@Override void callbak(){
}
};
}
}