static关键字主要有两种作用:第一,只想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。具体而言,static在Java语言中主要有四种使用情况:成员变量、成员方法、代码块、内部类。

(1)static成员变量

虽然Java语言中没有全局的概念,但可以通过static关键字来达到全局的效果。Java类提供了两种类型的变量:用static关键字修饰的静态变量和没有static关键字的实例变量。静态变量属于类,在内存中只有一个拷贝(所有实例都指向同一个内存地址),只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。对静态变量的引用有两种方式,分别为“类.静态变量”和“对象.静态变量”。

实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个拷贝。只能用“对象.实例变量”的方式来引用。以下是静态变量与实例变量的使用例子。

public class TestAttribute {public static int staticInt=0;

public int nonStaticInt=0;

public static void main(String[] args){

TestAttribute t=new TestAttribute();

System.out.println(“t.staticInt=”+t.staticInt);

System.out.println(“TestAttribute.staticInt=”+TestAttribute.staticInt);

System.out.println(“t.nonStaticInt=”+t.nonStaticInt);

System.out.println(“对静态变量和实例变量分别+1″);

t.staticInt++;

t.nonStaticInt++;

TestAttribute t1=new TestAttribute();

System.out.println(“t1.staticInt=”+t1.staticInt);

System.out.println(“TestAttribute.staticInt=”+TestAttribute.staticInt);

System.out.println(“t1.nonStaticInt=”+t1.nonStaticInt);

}

}

上例的运行结果为:

t.staticInt=0TestAttribute.staticInt=0

t.nonStaticInt=0

对静态变量和实例变量分别+1

t1.staticInt=1

TestAttribute.staticInt=1

t1.nonStaticInt=0

从上例可以看出,静态变量只有一个,被类拥有,所有的对象都共享这个静态变量,而实例对象是与具体对象相关的。需要注意的是,与C++语言不同的是,在Java语言中,不能在方法体中定义static变量。

(2)static成员方法

与变量类似,Java类同时也提供了static方法与非static方法。static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用。

static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用的时候,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量。

static一个很重要的用途是实现单例模式。单例模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法,由于构造对象被声明为private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把创建对象的方法声明为static。程序示例如下所示。

class Singleton{private static Singleton  instance = null;

private Singleton (){}

public static Singleton  getInstance() {

if( instance == null ) {

instance = new Singleton ();

}

return instance;

}

}

用public修饰的static变量和方法本质上都是全局的,如果在static变量前用private修饰,则表示这个变量可以在类的静态代码块或者类的其它静态成员方法中使用,但是不能在其它类中通过类名来直接引用。

(3)static代码块

static代码块(静态代码块)在类中是独立于成员变量和成员函数的代码块。它不在任何一个方法体内,JVM在加载类的时候会执行static代码块,如果有多个static代码块,JVM将会按顺序来执行。static代码块经常被用来初始化静态变量。需要注意的是,这些static代码块只会被执行一次。如下例所示。

public class Test {private static int a;

static {

Test.a = 4;

System.out.println(a);

System.out.println(“static block is called”);

}

public static void main(String[] args) {

}

}

程序运行结果为:

4static block is called

(4)static内部类

static内部类是指被声明为static的内部类,它可以不依赖于外部类实例对象而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法(包括私有类型)。如下例所示。

public class Outer {static int n =5;

static class Inner {

void accessAttrFromOuter(){

System.out.println(“Inner:Outer.n=”+n);

}

}

public static void main(String[] args){

Outer.Inner nest = new Outer.Inner();

nest.accessAttrFromOuter();

}

}

程序运行结果为:

Inner:Outer.n=5

需要注意的是,只有内部类才能被定义为static。

引申:

(1)什么是实例变量?什么是局部变量?什么是类变量?什么是final 变量?

实例变量:变量归对象所有,只有在实例化对象后才可以。每当实例化一个对象时,会创建一个副本并初始化,如果没有显示初始化,会初始化一个默认值。各个对象中的实例变量互不影响。

局部变量:在方法中定义的变量,在使用前必须初始化。

类变量:用static可修饰的属性;变量归类所有,只要类被加载,这个变量就可以被使用(类名.变量名)。所有实例化的对象共享类变量。

final变量:表示这个变量为常量,不能被修改。

(2)static与final结合使用表示什么意思?

static常与final关键字结合使用,用来修饰成员变量与成员方法,有点类似于“全局常量”。对于变量,如果使用static final修饰,则表示一旦赋值,就不可修改,并且通过类名可以访问。对于方法,如果使用static final修饰,则表示方法不可覆盖,并且可以通过类名直接访问。

常见笔试题:

public class Test {public static int testStatic() {

static final int i = 0;

System.out.println(i++);

}

public static void main(String args[]) {

Test test = new Test();

test.testStatic();

}

输出结果是什么?

A:0                    B:1                            C:2                            D:编译失败

答案:D。在Java语言中,不能在成员函数内部定义static变量。

《Java程序员面试笔试宝典》之Static关键字有哪些作用的更多相关文章

  1. 《Java程序员面试笔试宝典》之 instanceof有什么作用

    instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口.抽象类.父类)的实例,即它左边的对象是否是它右边的类的实例,返回boolean类 ...

  2. 《Java程序员面试笔试宝典》之volatile有什么作用

    在由Java语言编写的程序中,有时候为了提高程序的运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(例如寄存器)中来读取这个值,而不会去内存中 ...

  3. 《Java程序员面试笔试宝典》终于在万众期待中出版啦~

    <Java程序员面试笔试宝典>终于在万众期待中出版啦~它是知名畅销书<程序员面试笔试宝典>的姊妹篇,而定价只要48元哦,恰逢求职季节,希望本书的出版能够让更多的求职者能够走进理 ...

  4. 《Java程序猿面试笔试宝典》之volatile有什么作用

    在由Java语言编写的程序中.有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值.而不会去内 ...

  5. JAVA程序员面试笔试宝典1

    1.为什么Java中有些接口没有任何方法? 这些没有任何方法声明的接口又被称为标识接口,标识接口对于实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明它的类属于一个特定的类型. 2.j ...

  6. 《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法

    public staticvoid main(String[] args)为Java程序的入口方法,JVM在运行程序的时候,会首先查找main方法.其中,public是权限修饰符,表明任何类或对象都可 ...

  7. 《Java程序员面试笔试宝典》之Java程序初始化的顺序是怎样的

    在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象. Java程序的初始化一般遵循以下三个原则(以下三原则优 ...

  8. 《Java程序猿面试笔试宝典》之Statickeyword有哪些作用

    statickeyword主要有两种作用:第一,仅仅想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关.第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下 ...

  9. 《Java程序员面试笔试宝典》之为什么Java中有些接口没有任何方法

    由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念.接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类.接口中只包含方法的 ...

随机推荐

  1. jQuery获取select option

    jQuery的一些方法理出一些常用的方法: //获取第一个option的值 $('#test option:first').val(); //最后一个option的值 $('#test option: ...

  2. C++简介

    本文仅用于学习交流,转载请注明:http://www.cnblogs.com/mxbs/p/6266466.html  Hello,C++ World! 简介: C++融合了3中不同的编程传统:C语言 ...

  3. pyqt学习之列表管理器(网友提供)

    # -*- coding: utf-8 -*- __author__ = 'Administrator' import sys from PyQt4.QtCore import * from PyQt ...

  4. (转)iOS7界面设计规范(9) - UI基础 - 动画

    傍晚下了场大雨,现在坐在屋里也真是很风凉,听着Everlong突然觉得好像去年秋天的气息.每个季节都有各自的气息,每一年也是,如果你留意,便会感觉到.话说这几天,外面的猫猫狗狗们可以补些水来喝了,这也 ...

  5. [Angular 2] Using ng-for to repeat template elements

    This lesson covers Angular 2’s version of looping through data in your templates: ng-for. It’s conce ...

  6. Hadoop动态加入/删除节点(datanode和tacktracker)

    大体,正确的做法是首选的配置文件,然后开始详细机对应的进程/停止操作. 网上一些资料说在调整配置文件的时候,优先使用主机名而不是IP进行配置. 总的来说加入/删除DataNode和TaskTracke ...

  7. .NET基础拾遗(3)字符串、集合和流3

    三.流和序列化 3.1 流概念及.NET中常见流 无论什么信息,文字,声音,图像,只要进入了计算机就都被转化为数字,以数字方式运算.存储.由于计算机中使用二进制运算,因此数字只有两个:0 与 1,就是 ...

  8. 《第一行代码》学习笔记7-活动Activity(5)

    1.Intent中只能指定一个action,但却能指定多个category. 2.使用隐式Intent,不仅可以启动自己程序内的活动,还可以启动其他程序的活动,使得Android应用程序之间 的功能共 ...

  9. windows下配置svn的https访问

    svn是一个功能强大的代码版本管理系统,可以将服务端安装在linux.unix以及windows下.svn通常采用http方式进行代码提交与下载.由于密码采用明文传输,因此存在泄密的风险.若采用htt ...

  10. Jlink仿真器下载程序时出现Invalid ROM table!

    原因:仿真器时钟设置不对,应该将时间改低一点.