Java里静态与非静态该什么情况下使用 静态非静态java静态方法静态变量
程序员文章站
2022-07-11 10:53:55
...
文章为原创,转载请说明来源,谢谢。
作者:cha1R(tanjiayqq)
要搞清楚这个问题,我们需要清楚他们之间有什么区别,有什么优势和劣势。
首先看看静态与非静态方法的区别:
静态方法 | 实例方法
1、静态方法可以通过“类.方法()”调用 | 要在对象实例化后使用对象调用
2、只能使用静态变量和局部变量 | 所有变量都可以使用
3、静态方法不能被子类重写 | 实例方法可以
4、接口不能定义静态方法 | 实例方法可以
从上面区别来看,静态方法只有一个优势,就是调用的时候不用实例化,其他情况下跟实例方法相比都是处于劣势。那么我们在什么情况下会使用到静态方法?相信大家第一时间会想到一样的东西,工具类Util。工具类给我们开发带来了大大的方便,归根到底是“不用实例化就能用”的功劳。这是静态方法的一个优势。
而静态方法的劣势也很明显,局限性很大,不能重写,不能引用普通变量,接口不能定义等等。。。可能还有很多我没列举出来。
那究竟什么时候该用静态方法?我们就要最大化利用其优势而避其缺点:
1、一个方法完成一个独立的功能,而且不会干扰到其他方法或变量,则即使删掉这个方法,对其他东西都没有任何影响。
2、不依赖构造方法,不依赖接口,不依赖继承。(这也是为什么越学面向对象,越会纠结这个问题)
举个例子:String类即使删掉 static valueOf(Object obj)方法,也不会影响实例方法chatAt(int index)的使用。当然它可能会影响其他重载的valueOf方法。
至于现在网上很多资料都有一个误区,就是说静态方法一开始加载,会占用内存,而实例方法不会。这个说话其实是错误的,它们都是一样一开始就会加载,而且只会占用一份内存。因为方法不是变量,它只需要有一份内存就够了。而变量则不一样
-----------------------------------------------------------------------------------------------------------------------------------------------------------
下面来看看静态变量与非静态变量
静态变量 | 非静态变量
1、可以通过“类.变量”来引用。 | 只能通过实例对象来引用。
2、程序运行时分配内存 | 类实例化时分配内存。
3、只有一份内存被分配 | 有多少个类被实例化,就有多少个该类的变量那么多份内存被分配。
4、静态变量定义后必须声明初始化 | 非静态变量可以延迟初始化。
其他.....
很明显,静态变量拥有的优势不少,第一点不用说。第2、3点可以利用它来做一个整个程序的全局变量,因为任何修改都只会指向同一份内存。
而第3点优势恰好就是我们的“饿汉式单例模式”的一个最简单的实现。
我们也可以通过静态变量+静态方法的组合来封装一个完整的懒汉式单例模式。
在使用静态变量的时候,要注意一个线程问题,因为所有人都在操作它。
最后推荐一个学习的网站:http://gz.itcast.cn/
作者:cha1R(tanjiayqq)
要搞清楚这个问题,我们需要清楚他们之间有什么区别,有什么优势和劣势。
首先看看静态与非静态方法的区别:
静态方法 | 实例方法
1、静态方法可以通过“类.方法()”调用 | 要在对象实例化后使用对象调用
2、只能使用静态变量和局部变量 | 所有变量都可以使用
3、静态方法不能被子类重写 | 实例方法可以
4、接口不能定义静态方法 | 实例方法可以
从上面区别来看,静态方法只有一个优势,就是调用的时候不用实例化,其他情况下跟实例方法相比都是处于劣势。那么我们在什么情况下会使用到静态方法?相信大家第一时间会想到一样的东西,工具类Util。工具类给我们开发带来了大大的方便,归根到底是“不用实例化就能用”的功劳。这是静态方法的一个优势。
而静态方法的劣势也很明显,局限性很大,不能重写,不能引用普通变量,接口不能定义等等。。。可能还有很多我没列举出来。
那究竟什么时候该用静态方法?我们就要最大化利用其优势而避其缺点:
1、一个方法完成一个独立的功能,而且不会干扰到其他方法或变量,则即使删掉这个方法,对其他东西都没有任何影响。
2、不依赖构造方法,不依赖接口,不依赖继承。(这也是为什么越学面向对象,越会纠结这个问题)
举个例子:String类即使删掉 static valueOf(Object obj)方法,也不会影响实例方法chatAt(int index)的使用。当然它可能会影响其他重载的valueOf方法。
至于现在网上很多资料都有一个误区,就是说静态方法一开始加载,会占用内存,而实例方法不会。这个说话其实是错误的,它们都是一样一开始就会加载,而且只会占用一份内存。因为方法不是变量,它只需要有一份内存就够了。而变量则不一样
-----------------------------------------------------------------------------------------------------------------------------------------------------------
下面来看看静态变量与非静态变量
静态变量 | 非静态变量
1、可以通过“类.变量”来引用。 | 只能通过实例对象来引用。
2、程序运行时分配内存 | 类实例化时分配内存。
3、只有一份内存被分配 | 有多少个类被实例化,就有多少个该类的变量那么多份内存被分配。
4、静态变量定义后必须声明初始化 | 非静态变量可以延迟初始化。
其他.....
很明显,静态变量拥有的优势不少,第一点不用说。第2、3点可以利用它来做一个整个程序的全局变量,因为任何修改都只会指向同一份内存。
而第3点优势恰好就是我们的“饿汉式单例模式”的一个最简单的实现。
我们也可以通过静态变量+静态方法的组合来封装一个完整的懒汉式单例模式。
public class Singleton{ private static Singleton singleton = null; public static Singleton getInstance(){ if(singleton==null){ synchronized(Singleton.class){ if(singleton==null){ singleton = new Singleton(); } } } return singleton; } }
在使用静态变量的时候,要注意一个线程问题,因为所有人都在操作它。
最后推荐一个学习的网站:http://gz.itcast.cn/
上一篇: C# 客户端程序自动更新
下一篇: 鸿茅药酒事件的结局令人悲哀
推荐阅读
-
Java构造方法、成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的?
-
Java静态内部类和非静态内部类的区别与限制
-
Java里静态与非静态该什么情况下使用 静态非静态java静态方法静态变量
-
为什么静态方法无法直接调用非静态成员变量和方法
-
Java静态和非静态成员变量初始化过程解析
-
Java~使用synchronized修饰静态方法带来的问题 与 同步synchronized代码块不使用String作为锁对象的原因
-
j在多线程中java关键字synchronized的修饰静态方法和非静态方法得到的不同情况
-
j在多线程中java关键字synchronized的修饰静态方法和非静态方法得到的不同情况
-
php静态方法和非静态方法分别什么时候使用?
-
Java构造方法、成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的?