"问问题"-->目的:以问问题的方式,希望可以在语言的学习中,独立的全面的了解一块知识.
默认“方法”已经了解,本文主要目的介绍所谓的“静态”。
一、含义源于语义:static。[参考:http://developer.51cto.com/art/201204/332155.htm]
摘要:
static语义: static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
static作用: 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
static使用: 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。
注:
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
static语法:(可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的))
1.类名.静态方法名(参数列表...)-->静态方法只能调用静态的,因为实例成员与特定的对象关联,而静态的直接与类关联。
2.类名.静态变量名(
一般在需要实现以下两个功能时使用静态变量:
- 在对象之间共享值时
- 方便访问变量时
)
3.用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块
注:
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!——》尽量使用final,static 的优势还是加载!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
二、静态方法与实例方法的区别[参考:http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226923.html]
我们可以想象一下,类包括变量和方法,初始化成为对象之后,对象就有了内容和方式(联系到现实中的对象,比如做得,它有什么?(变量)它干什么?(方法)。)而在实际上对于一个对象,内容的概念就可以包括了全部,因为方法表示的功能本身就可以理解为其本身的内容。我们可以这样理解类细化出来了变量和方法,而现在我们已经知道了静态方法和实例方法(普通的方法),那么我们就要问这样做的目的和好处何在呢?试着想象一下,现在没有椅子,而你要设计一个椅子,你有了一个草图,而没有实物出现,那么椅子本身的一个功能能不能从草图中出现?对,起码“被制造”这个功能,应该直接可以从草图中的到!没有对象而需要利用对象,我自己的理解,这是静态的意义。
另外,有人的观点是:有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。我觉得这个想法出发的角度是从分析静态概念的角度出发的,而我的想法是从自然世界中对对象的概念出发的。
三、从虚拟机看静态[参考:http://moto0421.iteye.com/blog/1431910]
用 static的修饰的变量和方法,实际上是指定了这些变量和方法在内存中的“固定位置”-static storage。既然要有“固定位置”那么他们的 “大小”似乎就是固定的了,有了固定位置和固定大小的特征了,在栈中或堆中开辟空间那就是非常的方便了。静态表示的是内存的共享,就是它的每一个 实例都指向同一个内存地址。(静态初始化的控制权在Java中了,而非你自己控制的了,这样初始化次序会不会混乱呢,不安全)
四、从应用看静态
个人认为单例模式可以很好的了解静态方法。
单例的特征:确保一个类只有一个实例,并提供一个全局访问点,这和静态的观点不谋而合。
1 public class Singleton { 2 3 private volatile static Singleton instance = null; 4 5 private Singleton() { 6 } 7 8 public static Singleton getInstance() { 9 10 if (instance == null) { 11 synchronized (Singleton.class) { 12 if (instance == null) { 13 instance = new Singleton(); 14 } 15 } 16 } 17 return instance; 18 } 19 }
http://www.cnblogs.com/lance-/p/3553659.html
问题:由于初始化的权利全部由Java自行控制了,不同的类加载器仍然可能造成麻烦。[类加载概念https://www.ibm.com/developerworks/cn/java/j-lo-classloader/]
总结:只要类加载即被创建,直接与类关联,与对象无关,无需初始化。(想想main函数)
其他语言中的静态概念: