细说static关键字及其应用
场景
先看段代码,考虑以下场景,其运行结果是什么?
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关键字及其应用的更多相关文章
- 面试官:兄弟,说说Java的static关键字吧
读者乙在上一篇我去系列文章里留言说,"我盲猜下一篇标题是,'我去,你竟然不知道 static 关键字'".我只能说乙猜对了一半,像我这么有才华的博主,怎么可能被读者猜中了心思呢,必 ...
- 浅谈Static关键字
1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...
- (转)Java中的static关键字解析
转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...
- PHP的final关键字、static关键字、const关键字
在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...
- Java Static关键字详解
提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...
- 关于Java中的static关键字
Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...
- Java中的static关键字解析
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- c++中static关键字的用法总结
类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...
- static关键字
static关键字 static是静态修饰符,一般修饰成员.被static修饰的成员属于类,不属于单个这个类的某个对象. 1.static关键字的特点 a:随着类的加载而加载 b:优先于对象存在 (还 ...
随机推荐
- 解读Unity中的CG编写Shader系列五(理论知识)
转自 http://www.itnose.net/detail/6098474.html 经过前面的系列文章中的三个例子,尽管代码简单,但是我想应该还有些地方没有100%弄明白,我们现在得回过头来补充 ...
- MySQL SQL优化之in与range查询【转】
本文来自:http://myrock.github.io/ 首先我们来说下in()这种方式的查询.在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效 ...
- Effective C++ -----条款25:考虑写出一个不抛异常的swap函数
当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常. 如果你提供一个member swap,也该提供一个non-member swap用来调用前者.对于cla ...
- 2014 12th GDCPC 总结
这次真的需要好好总结反思.... 5月11日,今天是省赛...开赛前,有个人用麦说“balabala”之类的,终于有用麦讲话了=.=像点样了... 跟昨天热身赛一样,我来开VS,建项目云云... 开赛 ...
- nyoj123_士兵杀敌(四)_树状数组_插线求点
士兵杀敌(四) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战 ...
- poj 2051.Argus 解题报告
题目链接:http://poj.org/problem?id=2051 题目意思:题目有点难理解,所以结合这幅图来说吧---- 有一个叫Argus的系统,该系统支持一个 Register 命令,输入就 ...
- springmvc多文件上传
@RequestMapping(value = "/upload", method = RequestMethod.POST) public void upload(@Reques ...
- linux权限不够,sh不能用
linux下权限不够 chmod +x 脚本命令 ./脚本命令 即可... sh startup.sh启动tomcat,出现 This file is needed to run this prog ...
- LeetCode 191 Number of 1 Bits
Problem: Write a function that takes an unsigned integer and returns the number of '1' bits it has ( ...
- 完美解决:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x
如题: 原因:没有配置resolv.conf 解决方法: 到/etc目录下配置resolv.conf加入nameserver IP,如: nameserver 8.8.8.8nameserver 8. ...