`

回望Java中Static关键字

阅读更多

编写代码过程中常常用到static关键字修饰符,比如常用的工具类中我们会经常声明一些常用的static静态方法,如在JDK中的java.lang.Math类和java.lang.System类中的所有方法都被声明成为static方法;另外在程序中的全局常量经常也被声明成为static静态成员变量,比如一些固定的公式中的指定值,如自然对数的底数e为java.lang.Math.E,还有圆周长与直径之比pi为java.lang.Math.PI等。


对于我自己来说在实际的工作之中慢慢的能体会到在什么时候适合用static关键字,但是已经忘记了对static的真正理解,当对有的知识已经学会运用的时候,这个时候去反思为什么用,为什么这么用,在有实践的基础再去深入的理解他们我想会有更大的收获,你也许会体会到对于这些语言从整体上看前辈为什么会这样设计,出于什么目的以及他们的设计思想。所以我觉得思考是很关键的,用自己的脑子去思考……
 
static声明的有静态方法、静态成员变量、静态块、以及静态类,静态方法和静态成员变量又分别叫做类方法和类成员变量,试想为何在之前加一个“类”字?我们常用的成员变量和方法真正并不属于类,而是属于实例化的某个类对象,且每个实例化对象都有属于自己的成员变量。可见类方法和类成员变量并非属于特定的对象且特定的对象是在运行期间生成的,而它是属于类级别的在类被装载到内存的时候就被初始化了,跟实例化没有任何关系。被装载到的内存区域是一块专门存放静态变量的内存区域,可以叫做静态域,在《Thinking in Java》中对静态域叫做静态存储,是这样描述的:
静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
 
可以通过以下代码测试静态方法、静态成员变量、静态块、以及静态类的加载顺序:
public class StaticTest {
	private String str = "hello world";
	// 静态成员变量
	private static String str2 = "hello";
	// 静态块
	static {
		new StaticClass("test");
	}
	//静态块
	static {
		System.out.println(str2);
	}

	// 静态类
	static class StaticClass {
		public StaticClass(String str) {
			System.out.println(str);
		}
	}
	
	private  static String toSay(String str){
		return str;
	}
	public static void main(String[] args) {
		System.out.println(StaticTest.toSay("word"));
		StaticTest test = new StaticTest();
		System.out.println(test.str);
	}
}
 执行结果:
test
hello
word
hello world
可见在运行main主方法后,在调用System.out.println(StaticTest.toSay("word"));时就已经打印了test和hello,说明在类被加载到内存就已经执行了静态块的内容,根据test和hello打印先后顺序可以判断静态块是按照在代码中的先后顺序而执行的,如果静态块中涉及到静态类,则执行静态类的构造方法,然后才是执行main方法里的代码。
 
如果这一步理解到位了就能很容易的理解static了:它是类的公用全局变量或方法,对于类变量来说在类被加载时就被初始化了,始终只存在一份,存放于内存区的静态域内,跟类实例化对象没有关系,所以可以通过类名直接调用,正是因为跟实例化没有关系,所以在static方法中不能访问非静态成员(非静态成员必须依赖于实例化对象而存在),不会将对象的引用传递给它。
当真正理解了static后就能在应用中体会到它好处,首先毋庸质疑的是能很好的方便直接通过类名就能直接访问;另外通过static可以对全局变量作整体控制,维护一份static变量就能控制所有相关用到的引用;其次从内存空间角度来说在内存中只存在一份在占用内存空间和效率方面都有好处;还有是在运行期间之前可以加载一些后续业务的前提资源;但是也有人说由于static是面向类的而不是对象的,所以违背了面向对象的思想,然而事实上有经验的coder经常在使用static来编码。

 

2
2
分享到:
评论
8 楼 留下的祝福 2012-09-03  
首先,说的还是有一些道理。只是static修饰的变量或方法是由虚拟机来管理的,如果大量使用static,也要考虑一下内存方面!
7 楼 crawler 2012-09-02  
静态我认为在设计之初也包含着针对于动态的一种更高层次的抽象关系
liuzhaodong89 写道
静态我认为在设计之初也包含着针对于动态的一种更高层次的抽象关系。比如静态方法在类加载后就可以直接运行,静态变量在类加载完成后就能调用到。包括类在初始化时,其初始化顺序也是静态代码,静态代码块,动态代码,动态代码块。

静态我认为在设计之初也包含着针对于动态的一种更高层次的抽象关系。我觉得你说得很好,静态的设计只不过是根据实际情况将那些全局的或者不变的一些动态具有共性的东西或者叫做某种特针的东西进行一次封装让他变为静态的变成公用的来减少jvm的负担和提高jvm的利用率
6 楼 crawler 2012-09-02  
lh870003574 写道
不错,楼主能分析一下用static的缺点吗?

在多线程中使用static需要注意数据安全问题,很多东西至于缺点个人觉得是看你怎么运用他,适时适地的运用就是用的他的优点,也是他存在的意义所在,前提是你对它已经了解了,就像汽车一样对于有的人来说他是代步工具,对于有的人来说是马路杀手
5 楼 liuzhaodong89 2012-09-02  
静态我认为在设计之初也包含着针对于动态的一种更高层次的抽象关系。比如静态方法在类加载后就可以直接运行,静态变量在类加载完成后就能调用到。包括类在初始化时,其初始化顺序也是静态代码,静态代码块,动态代码,动态代码块。
4 楼 crawler 2012-09-02  
cywhoyi 写道
Permsize没考虑,static不仅仅只有楼主所说有点和缺点,在涉及到常量的时候,经常使用static final          

Permsize作为永久对象对存储空间大小设定确实要根据实际情况而设置
3 楼 cywhoyi 2012-09-02  
Permsize没考虑,static不仅仅只有楼主所说有点和缺点,在涉及到常量的时候,经常使用static final          
2 楼 lh870003574 2012-09-01  
不错,楼主能分析一下用static的缺点吗?
1 楼 tianma630 2012-09-01  
为啥是2年以上的coder才会用static   以下的就不会用 吗

相关推荐

    回望期权.doc

    回望期权 回望期权是一种强路径依赖期权,其收益依赖于期权有效期内标的资产的价格的最大值或最小值。一般分为回望看涨期权和回望看跌期权。 回望期权的概述: 回望期权是一种期权 phái生工具,它的价值取决于...

    java面试多线程高并发相关回家技巧(超经典)

    3. **线程同步**:为了解决多线程环境中的数据安全问题,Java提供了synchronized关键字、volatile变量、Lock接口(如ReentrantLock)等同步机制。 二、线程控制 1. **线程的启动、暂停与停止**:start()方法启动...

    java面试常问基础知识总结(超经典)

    4. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、Callable和Future接口,以及同步机制(synchronized关键字、Lock接口及其实现如ReentrantLock)、线程池(ExecutorService、...

    跳-扩散价格过程下有交易成本的回望期权定价研究

    本文研究了在跳-扩散价格过程背景下,交易成本对回望期权定价的影响。在金融市场中,期权是一种重要的衍生金融工具,它给予持有者在特定时间以特定价格买卖标的资产的权利。根据到期日执行时间的不同,期权分为欧式...

    回望专用记事本源码.e.rar

    5. 高亮显示:为了增强代码可读性,源码可能实现了对不同编程语言关键字的高亮显示,这涉及到字符串匹配和颜色设置。 6. 其他功能:如自动缩进、括号匹配、代码折叠等,这些都是提高编码效率的重要特性。 通过学习...

    shout.m_回望期权_SHOUT_shoutoption_

    描述中提到“回望期权的定价”,这暗示了该程序可能实现了某种期权定价模型,可能是经典的Black-Scholes模型的扩展,也可能是更适用于回望期权的其他模型,如Fleming-Wilmott模型或Rogers-Shepp模型。这些模型通常...

    Java笔试(超经典)时可能出现问题及其答案

    Java笔试是许多IT从业者在求职过程中必须面对的一关,它主要测试候选人的编程基础、算法理解、面向对象设计以及对Java特性的掌握程度。这份"Java笔试(超经典)时可能出现问题及其答案"资料,无疑是准备Java面试的一...

    Java面试SQL查询语句突击练习

    在Java面试中,SQL查询语句是不可或缺的一部分,尤其是在涉及数据处理、数据分析或者数据库管理的职位上。MySQL作为最常用的关系型数据库管理系统之一,对于Java开发者来说,掌握其SQL使用技巧至关重要。本资料"Java...

    高中历史之图说历史回望太平天国素材

    高中历史之图说历史回望太平天国素材

    monte carlo_optionpricing_回望期权_障碍期权_

    本文将详细探讨蒙特卡洛方法在奇异期权,特别是美式期权、回望期权和障碍期权定价中的应用。 首先,我们要理解什么是蒙特卡洛方法。这是一种基于随机抽样或统计试验的计算方法,用于解决那些在解析解难以求得或者...

    完整版回望专用记事本源码.rar

    - “回望专用记事本”可能是用C++、C#、Java或Python等常见编程语言编写的,每个语言都有其特定的编程风格和库。源码中可能使用了常见的GUI库,如Qt、wxWidgets或WinAPI,来创建图形用户界面。 4. **文本处理技术*...

    回望专用记事本源码.rar

    5. **编程语言和框架**:根据源码的扩展名,我们可以推测其使用的编程语言,如C++、Java、Python或C#等。此外,可能还使用了特定的框架或库来加速开发,如Qt、wxWidgets或.NET Framework。 深入研究《回望专用...

    餐饮行业深度分析-回望美国餐饮历程,看中国餐饮发展趋势.docx

    餐饮行业深度分析-回望美国餐饮历程,看中国餐饮发展趋势.docx

    Java,Jvm 的设计理念和Android的基础和贯彻

    回望Java——设计为Jvm一体的特性,Java是Jvm与编程人员的或窃窃私语,或雅望高谈(不过由于Java与Jvm背负了太多历史,GraalVM出来探路) Jvm的设计理念 平台无关性 和 语言无关性 Android设计理念 全面贴合TCP/IP...

    完整版回望专用记事本源码.e.rar

    《回望专用记事本源码》是一款专为回顾与学习设计的文本编辑器源代码。这个压缩包中包含了该记事本应用的全部源代码,对于编程爱好者和IT从业者来说,是一个很好的学习和研究资源。以下是这款记事本源码的一些关键...

    CPU历史之旅--回望过去的脚步.mht

    CPU历史之旅--回望过去的脚步.mht CPU历史之旅--回望过去的脚步.mht CPU历史之旅--回望过去的脚步.mht CPU历史之旅--回望过去的脚步.mht CPU历史之旅--回望过去的脚步.mht

    圣威尔士saintwealth回望期权原理介绍.docx

    ### 圣威尔士saintwealth回望期权原理介绍 #### 一、套利原理概述 在当前不稳定的市场环境中,本文旨在介绍一种外汇期权的套利模型及其运作原理。该模型由作者的朋友发现,并经过一系列的实践验证。下面将详细介绍...

    第一框 回望成长课件

    第一框 回望成长课件

Global site tag (gtag.js) - Google Analytics