这篇文章是关于Java static关键字的使用,主要会介绍以下的内容:

  1. static 的概念
  2. static的各种应用
  3. 总结

static 是什么

static 顾名思义是静态的意思。与this相对,static表示所修饰的部分是属于类本身所有的,不依赖与某个具体的实例。 而this上个博客已经讲了,可参考this的使用.this表示的是对调用方法的那个当前对象的引用,可以看做是类的实例的引用,依赖于具体的实例。所以这也就是《Java编程思想》里面说的

 “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”

在了解他使用之前,我们先思考一下,为什么我们需要使用staitc,一切都通过对象去调用不也可以吗?

这样做是可以,对象是可以调用实例变量,实例方法,类方法,类成员变量。但是这样真的好吗?我们有一些东西是不依赖具体对象。比如我们有一些工具类,如Math,里面的cos,sin这些都是客观存在,不会改变的。任何一个对象都不影响Math里面的任何东西,相反,像我们定义一个圆这个类,那么圆的半径,圆的面积显然是不同的圆 是不同的 这就不能用static。

好了,我们已经知道了static是什么,以及该什么时候去使用它,那我们我们都可以怎么用它呢?

static的用法

  1. static 变量
  2. static 方法
  3. static 代码块

static 变量

static变量就是静态的成员变量,所谓静态变量就是静态变量是归类本身所有,被所有对象所共享,在内存中只有一个副本。而非静态的就是每个对象所有,在内存中有多个副本,每个对象的副本互不影响。

比如我们常常自己定义或者是看源码中有很多常量,这些常量就是用final static修饰的。用static来修饰,让这个常量不需要new一个对象就能得到,非常的方便。例子如下:

/**
* Created by byhieg on 2016/6/20.
*/
public class CityFragment extends Fragment {
public static final String TAG = "CityFragment";
//省略其他代码
}

这样,我们就可以直接通过CityFragment.TAG来得到TAG。

static 方法

static 方法和static 变量的使用目的是一致的,一般用来不通过创建对象来使用方法,用来做工具类的方法。如我们可以把处理字符串的操作的方法统一放到一个固定类里面,我们调用的时候,只需要通过类名.方法名就可以,省去每次创建对象浪费的内存。比如下面的例子

/**
* Created by byhieg on 2016/6/20.
*/
public class StringUtils {
//根据输入的指定的字符,分割字符串
public static String[] splitString(String str,String regex) {
String [] result = str.split(regex);
return result;
} //删除指定位置的字符串
public static String delPosOfString(String str, int[] pos) {
StringBuffer sb = new StringBuffer(str);
for(int i = 0 ; i < pos.length;i++) {
sb.deleteCharAt(pos[i]);
}
return sb.toString();
}
}

我们可以直接这么调用StringUntils.splitString(args1,args2)

下面,我们说一些用static 方法的注意事项。我们看一下下面的例子。

/**
* Created by byhieg on 2016/6/20.
*/
public class Main {
public static final String str = "byhieg";
public String error = "error"; public void test() {
System.out.println(str);
System.out.println(error);
} public static void main(String[] args) {
System.out.println(test());
System.out.println(error);
System.out.println(str);
}
}

运行会出现下面的错误

Error:(13, 28) java: 无法从静态上下文中引用非静态 方法 test()
Error:(14, 28) java: 无法从静态上下文中引用非静态 变量 error

虽然我们举例用的Main方法,但他是static方法,使用的是统一的static语法规则。报错的原因是因为在静态方法中我们是无法调用非静态的成员变量和方法。因为非静态的方法和变量是依赖于对象创建,对象才能调用的。所以是不可以调用的。但是在非静态方法中,是可以调用全部,因为上文说了 静态的是归所有对象共享,非静态是省略了this才调用成功的。

/**
* Created by byhieg on 2016/6/20.
*/
public class Main {
public static final String str = "byhieg";
public String error = "error"; public void test() {
System.out.println(str);
System.out.println(error);
//此处省略了this 实际应该是this.test1(),this.error
//所以也是通过对象对调用的非静态的变量和方法
test1();
} public void test1() {
System.out.println(str);
System.out.println(error);
}
public static void main(String[] args) {
new Main().test();
}
}

static 初始化块

在说明静态初始化块的时候,我们先了解一下什么是初始化块。当我们需要生成很多对象的时候,每次都需要执行构造方法,如果我们的构造方法中,有一些代码是不依赖参数的,我们就可以把这些代码提取出来,放到同一个地方。这个地方我们称之为初始化块。

初始化块允许定义很多个,执行顺序与书写的顺序有关,但实际没什么卵用,因为他是创建Java对象时隐式执行,且全部被执行,完全可以把他们放到一起去执行。初始化块的执行会先于构造器,这点很重要。

接下来,我们看一下static静态块,static静态块除了有静态块的优点以外,他还有static所带来的优点,即他在类初次被加载时执行,且只会执行一次。不会像普通代码块一样,每次对象创建时都会执行,这样我们可以把一些造成空间浪费的语句,放到静态初始化块中执行。比如下面的代码

/**
* Created by byhieg on 2016/6/20.
*/
public class Main { public Main() {
Integer a = new Integer(1024);
//省略其他初始化代码 }
}

每次在new一个新对象的时候,都会创建一个新的Integer对象。这样无疑浪费空间,这时我们就需要用静态代码块,把Integer a放进去,就可以保证只会初始化一次。如下:

/**
* Created by byhieg on 2016/6/20.
*/
public class Main {
public static Integer a; static {
a = new Integer(1024);
} public Main() {
//省略构造器其他代码
}
}

静态初始化块执行的顺序在普通初始化块执行之前,因为只有类被加载并初始化之后,我们才能创建类的的实例,但以后再创建的实例的时候就不会再执行静态初始化块了。

总结

static 是与类相关的一个关键字,所修饰的部分表明该部分是归类所有。比如static修饰变量就表明该变量是静态变量,被所有对象所共享,被类所拥有。static修饰方法,与变量时一致的,只是在静态方法中是不允许调用非静态的变量和方法。而静态代码块是比较特殊的存在,用来初始化一些共有的东西,在类被加载时只执行一次。

Java static 的一两点使用的更多相关文章

  1. java static 变量,和方法从属于类

    第36集 java static 变量,和方法从属于类 可以用类来直接调用static属性和方法 static方法不能调用非静态的属性和方法,反之可以 new产生的对象,不包括static 属性和方法

  2. [转]java static final 初始化

    http://tanbing1986411.blog.163.com/blog/static/7259798220103610224434/ java static final 初始化 1.stati ...

  3. Java static修饰符

    Java static修饰符 static修饰符是静态修饰符,大家写Java第一次接触static就是主函数中的pubic static void main的声明了. 那么static有什么用?本文来 ...

  4. Java Static关键字详解

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

  5. Java this的一两点使用

    Java this的一两点使用 之前的文章都是关于Android的使用,这次想写一些关于Java的知识,总结一下Java的使用.这次写的是关于Java this的使用,介绍以下内容: this的概念 ...

  6. java static

    一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员 ...

  7. Java static解析

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块 一.static变量 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它 ...

  8. 13)Java static

    1.static变量      按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是:    ...

  9. JAVA! static什么作用?

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...

随机推荐

  1. 【maven】pom.xml报错:Cannot detect Web Project version.

    新建的maven项目 报错如下: Cannot detect Web Project version. Please specify version of Web Project through &l ...

  2. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

  3. windowsservice

    1.创建 windows服务 项目  文件 -> 新建项目 -> 已安装的模板 -> Visual C# -> windows ,在右侧窗口选择"windows 服务 ...

  4. Java RMI之HelloWorld篇

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  5. org.openqa.selenium.remote.SessionNotFoundException: Unexpected error launch IE

    1.在启动ie浏览器前先加入属性设置一项: DesiredCapabilities ie = DesiredCapabilities.internetExplorer(); ie.setCapabil ...

  6. 2016-2017 ACM-ICPC Asia-Bangkok Regional Contest

    A. WSI Extreme 将人按洗澡时间从大到小排序,那么$ans=\sum_{i=1}^{n}a_i\times\lfloor\frac{i+W-1}{W}\rfloor$. 当$W$比较大时, ...

  7. Python几种常用的测试框架

    一.测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过 ...

  8. php 搜索(查询)功能

    今天遇到一个问题:在做“搜索”功能时,输入查询条件后查询不了. 我做的是首页显示数据表package中的内容,但是有个条件,显示在首页的内容还必须是 :字段status=0,且printing=0的数 ...

  9. grunt 单独压缩多个js和css文件【转】

    原文地址:http://xiaomiya.iteye.com/blog/2177877 使用grunt来压缩前端js,css文件 因为最近做的客户端本地项目有用到十几个js,js提交之前都需要压缩.用 ...

  10. 新版startssl 免费SSL证书申请 (实测 笔记 https http2 必要条件)

    简单说明: 目前多个大型网站都实现全站HTTPS,而SSL证书是实现HTTPS的必要条件之一. StartSSL是StartCom公司旗下的.提供免费SSL证书服务并且被主流浏览器支持的免费SSL.包 ...