1.静态成员类优于非静态成员类
其实这一条标题个人感觉改成4种嵌套类的介绍更好。
1.1 什么是嵌套类?
嵌套类是指定义在另一个类的内部的类
嵌套类有四种:静态成员类、非静态成员类、匿名类、局部类
(这里注意一点:非静态成员类、匿名类、局部类 称为内部类,静态成员类不是内部类)
1.2 静态成员类
public class myTest1 {
private static class sardineFlat {
//这个就是静态成员类
}
}
上面的sardineFlat就是静态成员类,静态成员类可以看做一个普通类,可以访问外围类(图中的myTest1)的所有成员(无论共有或私有),注意,图中sardineFlat为private,所以只有 外围类的内部可访问,如果是public那么外面的一些类也能访问。
1.3 非静态成员类
非静态成员类最大的特点就在于其每个实例都会与外围类的一个外围实例相关联,要访问需要先访问外围实例。
public class myTest1 {
public static class IsStaticClass {
//这个就是静态成员类
public void xx(){
System.out.println("沙丁鱼flat:这是静态成员类");
}
}
public class IsNoStaticClass {
//这个就是非静态成员类
public void xx(){
System.out.println("沙丁鱼flat:这是非静态成员类");
}
}
}
public class nestedClassTest {
public static void main(String[] args) {
//静态成员类的引用
System.out.println("沙丁鱼flat:静态成员类的引用");
myTest1.IsStaticClass isStaticClass=new myTest1.IsStaticClass();
isStaticClass.xx();
//非静态成员类的引用
System.out.println("沙丁鱼flat:创建非静态内部类,需要外围类的实例");
myTest1 mytest1=new myTest1();
myTest1.IsNoStaticClass isNoStaticClass=mytest1.new IsNoStaticClass();
isNoStaticClass.xx();
}
}
结论:静态成员类不用先创建外围类的实例,非静态成员类需要先创建外围类的实例后才能创建非静态成员类。
注意事项:如果非静态成员类不需要访问外围实例,那么要改成静态成员类,因为非静态成员类每个实例都包含一个额外指向外围对象的引用,容易导致垃圾不回收(GC堆),造成内存泄露。
PS:非静态成员类用于map、set、List等集合接口。
1.4 匿名类
匿名类:不是外围类的成员,它是在使用的同时被声明和实例化的。
public abstract class myTest1 {
public abstract void xxx();
}
public class nestedClassTest {
public static void main(String[] args) {
//匿名类的引用
System.out.println("沙丁鱼flat:匿名类的引用");
myTest1 myTest110=new myTest1(){
public void xxx(){
System.out.println("沙丁鱼flat:这是匿名类");
}
};
myTest110.xxx();
}
}
1.5 局部类
局部类:就是成员(局部)里再建立成员类
public class myTest1 {
public void xxA(){
class jubu{
private void TestxxA(){
System.out.println("沙丁鱼flat:这是局部类");
}
}
jubu A = new jubu();
A.TestxxA();
}
}
2.限制源文件为单个顶级类
意思:就是不要在一个文件内定义两个类(嵌套类不算)
举个例子:
一个文件定义了两个类(class A、class B),另一个文件也定义了相同的两个类(class A、class B)
那么类就重名重复了,不知道该调用哪一个类。所以一个文件中最好只有一个顶级类。
结论:永远不要把多个顶级类或者接口放在一个源文件中