第二十四条:与静态类相比,优先选择静态成员类

每日一问:为啥要强调优先选择静态成员类,静态成员类和非静态成员类的优势是什么?

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)来手工建立这种关联关系也是有可能的,但是很少使用。正如你所预料的那样,这种关联关系需要消耗费静态成员类的实例空间,并且构造的时间开销。


简而言之,有四种不同的嵌套类,各有应有场景:如果一个嵌套类需要在单个方法之外仍然是可见的,或者他太长了,不适合方法内部,就应该使用成员类。

如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的;否则就做成静态的。

假设这个嵌套类属于一个方法的内部,如果你需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就把他做成匿名类;否则,就做成局部类。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值