文章为原创,转载请说明来源,谢谢。
作者: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/
分享到:
相关推荐
在Java中定义变量时需要慎重考虑是静态还是非静态,因为静态拥有绝对优先权!
java初学者在编写类,在调用方法,在静态方法与动态方法使用会出现的一些错误。 学习后 能初步了解自己的错误的原因 以及遇到这种错误的改正方法 避免下次踩坑
自己写的java中静态与非静态的区别 对二者的用法进行了比较说明。java中关于静态的用法与C系列中还是有区别的
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
java静态代码块与非静态代码块.doc
java静态代码块与非静态代码块参照.pdf
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
Java的静态代码块、非静态代码块、构造函数的简单的java代码
态变量是类中的一种特殊变量,他在运行是可以说是从属于类,也就是说由该类定义生成的所有对象共用同一个静态变量,内存中只有一个版本。这对于要求在程序运行过程中,只有一个对象副本存于内存非常重要,如在实现...
JAVA静态方法和非静态方法的区别和实例.doc
可能是最全的Redis静态工具类,拿来即用,随时随地RedisUtils.方法名()存取数据,每个方法都有对应的注释,快速上手!
MarkDown文档,大家应该都知道,@Value注解可以给类中的非静态变量注入值,但是给静态变量注入值则会有警告,结果是失败的,本文档说明了如何使用@Value注解给类的静态变量赋值
● 静态变量是基本数据类型,这种情况下在类的外部不必创建该类的实例可以直接使用 ● 静态变量是一个引用。这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将...
静态变量和非静态变量的区别
java静态内部类(嵌套类)的实例 。嵌套类意味着: 1. 要创建嵌套类的对象,并不需要其外围类的对象。 2. 不能从嵌套类的对象中访问非静态的外围类对象。
java类中静态域、块,非静态域、块,构造函数的初始化顺序,通过本例子,能够清楚了解到java类的初始化顺序
静态/非静态 方法/变量的写法 大家应该都明白静态方法/字段比普通方法/字段的写法要多一个static关键字,简单写下他们的写法吧,了解的可以直接略过 class Test{ // 静态变量 public static int id = 1; // 普通...
主要介绍了Java静态和非静态成员变量初始化过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1)非静态属性String studentNumber 2)非静态属性String studentName 3)非静态属性int markForMaths 4)非静态属性int markForEnglish 5)非静态属性int markForScience 方法有: 1)构造方法Student(String number, ...