每日一问:为啥要强调优先选择静态成员类,静态成员类和非静态成员类的优势是什么?
public class HelloWorld2 {
public void test1(){}
public static void test2(){}
public static void main(String[] args) {
// 非静态成员类每次要实例化和消耗内存
new HelloWorld2().test1();
// 静态成员类直接访问内部
HelloWorld2.test2();
}
}
结论:
1.非静态成员类每次要实例化和消耗内存性能
2.静态成员类直接访问内部,不需要跟helloword2外部类进行联系,也降低了类的曝光度
嵌套类(nested class)是指被定义在另一个类的内部的类。嵌套类存在的目的应该只是为他的外围类(enclosing class)提供服务。
如果嵌套类将来可能会用于其他的某个环境中,他就应该是顶层类(top-level class)。
嵌套类有四种:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous class)和局部类(local class)。
除了第一种之外,其他三种都称为内部类(inner class)。
从语法上讲,静态成员类和非静态成员类之间的唯一区别是,静态成员类的声明中包含修饰符static。尽管他们的语法非常相似,但是两种嵌套类有很大的不同。
非静态成员类的每个实例都隐含着与外围类的一个外围实例(enclosing instance)相关联。在非静态成员类的实例方法内部,可以调用外围实例上的方法,或者利用修改过的this构造获得外围实例的引用。
如果嵌套类的实例可以在他外围类的实力之外独立存在,这个嵌套类就必须是静态成员类:在没有外围实例的情况下,要想创建非静态成员类的实例是不可能的。
案例:
public class HelloWorld2 {
public void test1(){}
public static void test2(){}
class NestedClass1{
public NestedClass1() {
test1();
}
}
static class NestedClass2{
public NestedClass2() {
test2();
}
}
}
如果我们声明的成员类不需要访问包围实例,那么就应该总是将static修饰符放在它的声明中,
当非静态成员类的实例被创建的时候,他和外围之间的关联关系也随之被创立起来;而且,这种关联关系以后不能被修改。通常情况下,当在外围类的某个实例方法的内部调用非静态成员类的构造器时,这种关系被自动建立起来。
使用表达式enclosingInstance.new MemberClass(args)来手工建立这种关联关系也是有可能的,但是很少使用。正如你所预料的那样,这种关联关系需要消耗费静态成员类的实例空间,并且构造的时间开销。
简而言之,有四种不同的嵌套类,各有应有场景:如果一个嵌套类需要在单个方法之外仍然是可见的,或者他太长了,不适合方法内部,就应该使用成员类。
如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的;否则就做成静态的。
假设这个嵌套类属于一个方法的内部,如果你需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就把他做成匿名类;否则,就做成局部类。