java中的static关键词
以下来自:http://www.cnblogs.com/codc-5117/archive/2011/12/04/2275298.html
Static基本规则:
(1)一个类的静态方法只能访问静态属性。
(2)一个类的静态方法不能直接调用非静态方法。
(3)如果访问权限允许,static属性和方法可以使用对象加’.’方式调用,当然也可以使用实例加’.’方式调用。
(4)静态方法中不存在当前对象,所以不能使用this,当然也不能使用super。
(5)静态方法不能被非静态方法覆盖。
(6)构造方法不允许被声明为static的。
学习笔记,材料来自:
http://www.cnblogs.com/dolphin0520/p/3799052.html
static关键词,可以加在方法上,成员变量上,代码块。 类就不要想了。
1. static方法
static方法可以在类没有实例化的情况话直接访问。 在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
2. static变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
static变量只会有一个内存空间,虽然后多个实例,但这些实例中的static变量会共享同一个内存空间。所以静态变量的值发生变更要格外注意,以免造成不必要的“bug”。
static变量是在类装载的时候就被初始化的。
3. static代码块
可以用来初始化一些成员信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class testClassA { public static int val = 1 ; static { System.err.println( "11:" + val); val = 2 ; System.err.println( "22:" + val); } public static int getVal() { return val; } } System.err.println(testClassA.getVal()); |
结果:
1 2 3 | 11 : 1 22 : 2 2 |
4. static内部类
以下来自:http://blog.csdn.net/jiangxinyu/article/details/8177326
为何要用内部类?
1). 内部类一般只为其外部类使用;
2). 内部类提供了某种进入外部类的窗户;
3). 也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class ClassA { public static String val = "1" ; public ClassA() { } public static class ClassB { //静态内部类 public static int bVal = 2 ; } public class ClassC { public ClassC() { } private void name() { System.err.println( "abc" ); } } } |
5. static静态导入
静态导包是为了简化代码,提高代码的阅读性,但是如果滥用阅读性会很糟糕。
对于静态导入,一定要遵循两个规则(来自下面的资料):
- 不使用*(星号)通配符,除非是导入静态常量类(只包含常量的类或接口)。
- 方法名是具有明确、清晰表象意义的工具类。
更多static静态导包资料:http://www.weixueyuan.net/view/6101.html
import static java.lang.System.*; public class testClass { public static void main(String[] args) { err.println();//这里就不用system.err.println()了。 } }
6. 实现单例
参考资料:http://devbean.blog.51cto.com/448512/203501/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class ClassA { private static ClassA instance = null ; public static synchronized ClassA getInstance() { //静态方法生成实例 懒汉模式 用到的时候再实例化 if (instance == null ) { instance = new ClassA(); } return instance; } public void test() { System.err.println( 1 ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class ClassA { private static ClassA instance = new ClassA(); // 饿汉模式,直接生成实例 public static ClassA getInstance() { return instance; } public void test() { System.err.println( 1 ); } } |
//使用volatile关键词,单例模式最优解决方案,不支持旧版jdk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class ClassA { private volatile static ClassA instance = null ; public static ClassA getInstance() { if (instance == null ) { synchronized (ClassA. class ) { if (instance == null ) { instance = new ClassA(); } } } return instance; } public void test() { System.err.println( 1 ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //静态内部类实现单例模式 兼容旧版jdk public class ClassA { private ClassA() { } private static class InstanceClass { private static ClassA instance = new ClassA(); } public static ClassA getInstance() { return InstanceClass.instance; } public void test() { System.err.println( 1 ); } } |
1 | ClassA.getInstance().test(); //使用方法 |
7. 一些注意事项:
1. 静态的成员变量可以被实例化后的类对象访问,静态方法也可以被对象访问,但是会有警告。
2. 局部变量不可以static。
3. static代码块优先于构造函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)