场景


先看段代码,考虑以下场景,其运行结果是什么?

public class Test {

    static int i = 8;

    public void printI() {
int i = 88;
System.out.println(this.i);
} public static void main(String arg[]) {
Test t = new Test();
t.printI();
}
}

最后的运行结果是:8

如果把 this 关键字去掉的话,则结果是 88 ,当然这里有一些对关于 this 关键字的考察。

static 关键字


包含了使用 static 关键字声明的变量或者方法与包含它的类实例对象是没有关联的。因为静态化的域或者方法在类实例化前就已经加载入内存当中了,而并非是需要实例化该类声明的对象后,内存中才会为其分配内存。让我们再看看下面的代码:

class Test {

    static int i = 8;

    public void printI() {
System.out.println("i:"+this.i);
} public static void main(String arg[]) {
System.out.println(Test.i);
Test.test(); Test.i++; // 自增i
Test a = new Test(); //声明测试对象a
a.printI();
a.i++; // 自增i Test b = new Test();//声明测试对象b
b.printI();
}
}

运行结果:

8

i:9

i:10

正如上面所说的,变量 i 脱离于对象实例化而存在,即使我们在分别声明对象 a 和对象 b ,当我们对a对象的i进行自增操作后,后面的b对象却打印 9,因为对象 a和 b 是共用变量 i 的。

静态方法


静态方法不可以调用非静态的方法或者变量,反之非静态方法是可以调用静态方法的。例如:

int j = 10;

public static void test() {
System.out.println("j:"+ j);
}

会发现编译器提示这样的错误:Cannot make a static reference to the non-static field j 而我们很容易写出这样的代码。显然静态方法给我们编写代码时带来了非常大的便利,我们无须在调用其方法时需要实例化其对象,我们在封装我们的 Utils 工具类时经常这样做,因为这样做既方便又可提升程序的性能。《Effective Java》中有详细讲到static工厂方法。

static之单例应用

正如上面代码片段2中所看到的实例一样,静态变量无须实例化便可调用,且被修饰的域是静态处于内存中的,所以对于那些被频繁实例化的对象,为了避免多次重复的实例化,我们可以通过静态化该对象,从而实现对程序的性能优化。例如我们经常会在 Web 项目里面静态化 JDBC 链接对象,或者业务逻辑层 中的对象,,或者封装工厂方法,然后写个工厂单例类。当然我们已经有了 Spring ,通过利用反射机制,统一管理这些Bean对象,实现自动的按需注入。在 Playframework 这个快速开发 Web 的框架中,其 Controller 中的方法都被声明为了静态方法。声明单例的方法有很多种,请看下面的代码:


public class Singleton { private final static Singleton INSTANCE = new Singleton();
private Singleton() {} public static Singleton getInstance() {
return INSTANCE;
} public void test() {
System.out.println("this is a test method.");
}
}

该类的构造方法被 private关键字修饰,意味着该对象不可用new关键字进行实例化了,当然我们已经在此类中提供了静态方法 getInstance 通过这个方法获取该类的静态实例对象。由于该对象实例后被保存在了静态变量INSTANCE 中,所以调用者每次调用的都是这个实例对象。调用示例:

    Singleton c = Singleton.getInstance();

    c.test(); // 调用test方法

作者:Ziv小威
出处:http://imziv.com/
关于作者:专注于Java技术的程序员一枚,此外对JS开发保持着较高的兴趣。爱好音乐,阅读,FM等等。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
如有问题,可以邮件:wewoor@foxmail.com
微博:Ziv小威

 
 

细说static关键字及其应用的更多相关文章

  1. 面试官:兄弟,说说Java的static关键字吧

    读者乙在上一篇我去系列文章里留言说,"我盲猜下一篇标题是,'我去,你竟然不知道 static 关键字'".我只能说乙猜对了一半,像我这么有才华的博主,怎么可能被读者猜中了心思呢,必 ...

  2. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  3. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  4. PHP的final关键字、static关键字、const关键字

    在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...

  5. Java Static关键字详解

    提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...

  6. 关于Java中的static关键字

    Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...

  7. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  8. c++中static关键字的用法总结

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  9. static关键字

    static关键字 static是静态修饰符,一般修饰成员.被static修饰的成员属于类,不属于单个这个类的某个对象. 1.static关键字的特点 a:随着类的加载而加载 b:优先于对象存在 (还 ...

随机推荐

  1. ios Unit test 入门书籍推荐

    请参考 ios 7 by tutorials 中的 chapter 11 :Unit Testing in xcode 5

  2. reportng的使用

    1.首先安装testng 2.下载reportng jar包 http://pan.baidu.com/s/1i3KdlQH 3.添加到project build path 注意:需要同时引入goog ...

  3. js数组转置

    <script type="text/javascript">     var arr=[[1,2,3],[4,5,6],[7,8,9],[17,18,19]];    ...

  4. Python批量修改文件名-后缀

    LyncLynn用途: 批量修改文件格式,文件名后缀. #Version: V1.0 #Author:lynclynn #Description:Change the filename #Create ...

  5. Python: 程序print到文件中

    Python 3.x 将输出内容写入到一个文件,需要两个命令.open指明Python用什么文件名,w 意味着我们要写入该文件, encoding=”utf-8″指明Python如何把中文写入该文件. ...

  6. Valentine's Day Round 1001.Ferries Wheel(hdu 5174)解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1] ...

  7. java中方法参数的一些总结(1)

    1.问题说明        在C++中,函数调用时有传值调用和传址调用两种方式,但在Java中只有传值调用一种方式.Java中的方法参数为那几种基本数据类型的情况跟C++中一样,传入的只是变量的拷贝. ...

  8. AFNetworking request failed unacceptable content type text/html

    今天体验AFNetwork 3.1.0 进行数据解析,但是解析数据控制台一直都输出这样的 error 结果: 于是,照着以前AFN2.+版本的进行设置: 结果发现在新版本的 AFN 上不能设置了.既然 ...

  9. 决绝Capturing 'demo' strongly in this block is likely to lead to a retain cycle

    - (IBAction)onTest:(id)sender { BlockDemo *demo = [[BlockDemo alloc]init];  __weak typeof(BlockDemo) ...

  10. NYOJ题目817英文藏头诗

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtEAAAKXCAIAAADLqoEhAAAgAElEQVR4nO3dO1LrzNbG8W8S5AyE2D