近日在做网络通信服务器和客户端的Java语言开发,碰到了获取客户端长连接Channel对象,利用唯一对象Client的获取方法getSingleClientInstance()
,以为可以得到,但是显示始终为空指针。之后又换了好几种获取值的办法,一直是空指针。最后想着static修饰符的作用不是初始化就给了唯一一个内存空间吗?所以改用在Client属性中声明Channel对象为静态对象,又利用getChannel()
获取这个静态对象,终于找到你,此时很激动Elate。所以全面的找了一下static修饰符的用法。
既然是修饰符,当然可以修饰一切可以修饰的对象 。 比如,变量、方法、代码块、内部类!也可以这样理解,static域和非static域的存储空间是不同的,被static修饰符修饰的对象,都被存储在静态存储区,当然,每个类的方法也是在静态存储区的。这也就是所说的static修饰的变量和方法被称为类属性和类方法,不隶属于哪一个对象。
1. 变量
一个变量有了static修饰符,内存会为它分配唯一的一块存储空间。程序跑起来的时候,变量就存在在内存里了。谁要用它,就去访问一下它所在的内存。
2. 方法
一个方法被static修饰,可直接访问;不被static修饰,就需要用对象来访问了。
3. 代码块
静态块–>非静态块–>构造函数的顺序执行。
加载静态块时为它分配固定的内存,程序结束时内存才被释放。而非静态块和构造函数则是new一次执行一次。
4. 内部类
只能修饰内部类。
静态内部类也可以拥有静态方法和非静态方法
静态内部类只可以访问外部类的静态成员和静态方法,不可以访问非静态成员和非静态方法
静态内部类访问自己内部的静态成员和静态方法时,也是通过点出来的,不过在前面需要加上外部类的名字。
5.静态导包
静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法。在单元测试中用的多。比如Assert类的静态导入。
6. 注意事项
被static修饰的方法中不能出现非static对象。