这篇文章是关于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. C#开发中常用方法2------json转DataTable

    /// <summary>/// 将json转换为DataTable/// </summary>/// <param name="strJson"&g ...

  2. NAIPC-2016

    A. Fancy Antiques 爆搜+剪枝. #include <bits/stdc++.h> using namespace std ; typedef pair < int ...

  3. C# asp.net 搭建微信公众平台(可实现关注消息与消息自动回复)的代码以及我所遇到的问题

    [引言] 利用asp.net搭建微信公众平台的案例并不多,微信官方给的案例是用PHP的,网上能找到的代码很多也是存在着这样那样的问题或者缺少部分方法,无法使用,下面是我依照官方文档写的基于.net 搭 ...

  4. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  5. 【BZOJ3156】防御准备 斜率优化DP

    裸题,注意:基本的判断(求Min还是Max),因为是顺着做的,且最后一个a[i]一定要取到,所以是f[n]. DP:f[i]=min(f[j]+(i-j-1)*(i-j)/2+a[i]) 依旧设x&g ...

  6. Java:单例模式的七种写法

    第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton ( ...

  7. [RxJava^Android]项目经验分享 --- RxLifecycle功能实现分析(一)

      最近在研究RxJava自定义操作符的实现原理,发现成型的项目案例较少.突然想起在项目中应用的RxLifecycle是使用自定义操作符,便拿来研究了一下.分析之前,跟大家了解一些相关操作符和RxLi ...

  8. Android RecyclerView 的简单使用

    Android L SDK发布的,新API中最有意思的就是RecyclerView (后面为RV) 和 CardView了, 按照官方的说法, RV 是一个ListView 的一个更高级更灵活的一个版 ...

  9. grunt-connect-proxy解决开发时跨域问题

    最近的项目中前后端是完全分离开发的,前端用grunt管理项目.这样就会导致一个问题:开发时前端调用后台的接口时因为不在一个服务器,所以会出现跨域问题.但是也不能用JSONP或CROS方式实现真正的跨域 ...

  10. 用.net在画出镂空图片

    最近的一个项目需要用到这个东西,冥思苦想了好几天.还是在同事的帮助下,完成此项难题,希望能够帮助以后的博友们 ! 废话不多说,先看看效果图吧. 首先写一下讲一下思路,首先画一张图,当你的背景,然后在图 ...