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. ubuntu14.04 cocos2d-x-3.6 glfw编译出错解决方案

    lib/libcocos2d.a(CCGLViewImpl-desktop.cpp.o): In function `cocos2d::GLViewImpl::GLViewImpl()': /home ...

  2. python3-day4(装饰器)

    一.基本 第一波 #### def foo():     print 'foo'   foo     #表示是函数 foo()   #表示执行foo函数   #### 第二波 #### def foo ...

  3. angularjs基本执行流程

    近期温习了下angularjs执行流程,备记下.以便查看. 主要的执行流程例如以下: 1.用户请求应用起始页. 2.用户的浏览器向server发起一次HTTP连接,然后载入index.html页面,这 ...

  4. Win32多线程编程(2) — 线程控制

    Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...

  5. Web Service学习笔记(webservice、soap、wsdl、jws详细分析) (转)

    Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...

  6. android 隔几秒再执行

    今天做项目,需要前面的方法执行完等待2秒在关闭当前页面.之前使用的是Thread.sleep(2000)发现根本没有作用.经过多次尝试,发现需要使用以下方法才能实现: new Thread(){ pu ...

  7. Objective-C 字典、可变字典

    字典相当于c++ stl中的map 字典NSDictionary #import <UIKit/UIKit.h> #import "AppDelegate.h" int ...

  8. 18 java 代理模式 (转)

    静态代理 1.新建一个接口,这个接口所提供的方法是关于数据库操作的 public interface EmployeeDao { public void updateSalary(); } 2.建一个 ...

  9. linux打开80端口及80端口占用解决办法

    linux打开80端口天客户那边有台服务器同一个局域网中都无法访问,排除lamp环境问题,发现时服务器中的防火墙没有开启80端口. 代码如下 复制代码vi /etc/sysconfig/iptable ...

  10. Jquery对回复者添加匿名评论选项

    通过prop方法获取checked属性,获取的checked返回值为boolean,选中为true,否则为flase <input type="checkbox" id=&q ...