编写代码过程中常常用到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来编码。
相关推荐
回望期权 回望期权是一种强路径依赖期权,其收益依赖于期权有效期内标的资产的价格的最大值或最小值。一般分为回望看涨期权和回望看跌期权。 回望期权的概述: 回望期权是一种期权 phái生工具,它的价值取决于...
3. **线程同步**:为了解决多线程环境中的数据安全问题,Java提供了synchronized关键字、volatile变量、Lock接口(如ReentrantLock)等同步机制。 二、线程控制 1. **线程的启动、暂停与停止**:start()方法启动...
4. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、Callable和Future接口,以及同步机制(synchronized关键字、Lock接口及其实现如ReentrantLock)、线程池(ExecutorService、...
今天,当我们回望过去,55个手机JAVA全屏触屏游戏的集合,不仅仅是对那个时代的怀旧,更是对技术发展和移动游戏历史的一次致敬。 这些游戏之所以特别,首先因为它们是基于JAVA平台开发的。JAVA(Java 2 Platform, ...
本文研究了在跳-扩散价格过程背景下,交易成本对回望期权定价的影响。在金融市场中,期权是一种重要的衍生金融工具,它给予持有者在特定时间以特定价格买卖标的资产的权利。根据到期日执行时间的不同,期权分为欧式...
5. 高亮显示:为了增强代码可读性,源码可能实现了对不同编程语言关键字的高亮显示,这涉及到字符串匹配和颜色设置。 6. 其他功能:如自动缩进、括号匹配、代码折叠等,这些都是提高编码效率的重要特性。 通过学习...
描述中提到“回望期权的定价”,这暗示了该程序可能实现了某种期权定价模型,可能是经典的Black-Scholes模型的扩展,也可能是更适用于回望期权的其他模型,如Fleming-Wilmott模型或Rogers-Shepp模型。这些模型通常...
Java笔试是许多IT从业者在求职过程中必须面对的一关,它主要测试候选人的编程基础、算法理解、面向对象设计以及对Java特性的掌握程度。这份"Java笔试(超经典)时可能出现问题及其答案"资料,无疑是准备Java面试的一...
在Java面试中,SQL查询语句是不可或缺的一部分,尤其是在涉及数据处理、数据分析或者数据库管理的职位上。MySQL作为最常用的关系型数据库管理系统之一,对于Java开发者来说,掌握其SQL使用技巧至关重要。本资料"Java...
高中历史之图说历史回望太平天国素材
本文将详细探讨蒙特卡洛方法在奇异期权,特别是美式期权、回望期权和障碍期权定价中的应用。 首先,我们要理解什么是蒙特卡洛方法。这是一种基于随机抽样或统计试验的计算方法,用于解决那些在解析解难以求得或者...
- “回望专用记事本”可能是用C++、C#、Java或Python等常见编程语言编写的,每个语言都有其特定的编程风格和库。源码中可能使用了常见的GUI库,如Qt、wxWidgets或WinAPI,来创建图形用户界面。 4. **文本处理技术*...
5. **编程语言和框架**:根据源码的扩展名,我们可以推测其使用的编程语言,如C++、Java、Python或C#等。此外,可能还使用了特定的框架或库来加速开发,如Qt、wxWidgets或.NET Framework。 深入研究《回望专用...
餐饮行业深度分析-回望美国餐饮历程,看中国餐饮发展趋势.docx
回望Java——设计为Jvm一体的特性,Java是Jvm与编程人员的或窃窃私语,或雅望高谈(不过由于Java与Jvm背负了太多历史,GraalVM出来探路) Jvm的设计理念 平台无关性 和 语言无关性 Android设计理念 全面贴合TCP/IP...
《回望专用记事本源码》是一款专为回顾与学习设计的文本编辑器源代码。这个压缩包中包含了该记事本应用的全部源代码,对于编程爱好者和IT从业者来说,是一个很好的学习和研究资源。以下是这款记事本源码的一些关键...
CPU历史之旅--回望过去的脚步.mht CPU历史之旅--回望过去的脚步.mht CPU历史之旅--回望过去的脚步.mht CPU历史之旅--回望过去的脚步.mht CPU历史之旅--回望过去的脚步.mht