场景


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

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小威

转载于:https://www.cnblogs.com/ImaY/p/3854975.html

细说static关键字及其应用相关推荐

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

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

  2. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  3. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  4. static关键字用法

    static关键字 1.修饰成员变量 在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员,这句 ...

  5. Java中的static关键字的用法

    1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法. (2 ...

  6. java的static关键字

    java的static关键字 静态变量和静态方法 static关键字最基本的用法是: 1.被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2.被static ...

  7. 面试季,Java中的static关键字解析

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面 ...

  8. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

  9. static关键字了解解析

    什么是static关键字 static关键字我们经常接触,不过我们一直没有讨论过它到底是什么,有什么具体的作用,那static关键字是什么呢,有啥用呢? static是静态的意思,是一个修饰符,就像是 ...

  10. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

最新文章

  1. 春季每日一题2022 Week 2 【完结】
  2. 锋利的jQuery--关于$(document).ready()函数及jQuery代码风格
  3. oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换
  4. mysql的datetime使用_datetime数据类型 MySQL数据库使用教程
  5. oracle设置每列字符数,如何修改一个数字字段
  6. 如果Java快死了,那么它肯定看起来非常健康
  7. arm ubuntu 编译boost_为arm linux 交叉编译boost 1.33.1
  8. 如何落地云原生DevOps?
  9. 洛谷 深基 第1部分 语言入门 第2章 顺序结构程序设计
  10. PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP
  11. 随笔2010.01.25
  12. Ext使用中问题总结
  13. 为什么老师说尽量别用wps(图文详解)
  14. QQ音乐下载的flac文件转码mp3文件
  15. Qualcomm MSM8937 dual DSI 笔记
  16. matlab中卡尔曼滤波,卡尔曼滤波算法及MATLAB实现
  17. 语音信号处理及特征提取
  18. VirtualDub在处理WMV文件时显示“MISSING CODEC”怎么办
  19. Remote Desktop Connection Manager
  20. 盘点5月份GitHub上最热门的开源项目

热门文章

  1. stl map 查找不到返回什么_STL 容器结构和分类
  2. 【POJ1050+POJ2018+HDOJ6638+牛客1006D】最大子段和问题
  3. Seaborn绘制kdeplot和distplot
  4. opc服务器的时间怎么修改,OPC服务器是否允许在其逻辑中使用源时间戳?(Is OPC server allowed to use source timestamp in its logic?)...
  5. oracle负数,oracle取交集_oracle取负数_oracle case when
  6. android asynctask源码分析,Android异步任务AsyncTask的使用与原理分析
  7. Python中的输入输出(IO)
  8. 图解Python机器学习pdf 中日双语 第1页
  9. 决策树C4.5算法的不足
  10. 把数字翻译成字符串的方法数