场景


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

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. Bitnami --https://bitnami.com/stacks

    Bitnami is an app store for server software. Install your favorite applications in your own servers ...

  2. 【leetcode】Validate Binary Search Tree

    Validate Binary Search Tree Given a binary tree, determine if it is a valid binary search tree (BST) ...

  3. C++构造函数初始化顺序

    [本文链接] http://www.cnblogs.com/hellogiser/p/constructor-order.html 1.构造函数.析构函数与拷贝构造函数介绍 构造函数 构造函数不能有返 ...

  4. linux /usr/bin/ld cannot find 解决

    问题: 在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的source ...

  5. 18. javacript高级程序设计-JavaScript与XML

    1. JavaScript与XML IE采取了下列方式: l 通过ActiveX对象来支持处理XML,而相同的对象也可以用来构建桌面应用程序 l Windows携带了MSXML库,JavaScript ...

  6. MongoDB 数据库管理(不定时更新)

    之前的几篇文章大致说了副本集的搭建.副本集的管理,现在说下MongoDB数据库的管理.数据库管理包括:备份.还原.导入.导出.服务器管理等. 一:查看服务器状态,查看命令行参数.db.serverSt ...

  7. 解决VM虚拟机MAC OS X 10.10.x的卡顿问题

    点此链接下载beamoff安装到虚拟机即可.

  8. 在wpf中使用winrt的Toast弹框效果

    源码地址:https://code.msdn.microsoft.com/windowsdesktop/Sending-toast-notifications-71e230a2/sourcecode? ...

  9. Base64编码格式详解

    什么是Base64? 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base64 Content-T ...

  10. September 27th 2016 Week 40th Tuesday

    Friends are lost by calling too often and calling seldom. 交往过密过疏,都会失去朋友. Please mind your own busine ...