《Java程序猿面试笔试宝典》之Statickeyword有哪些作用
statickeyword主要有两种作用:第一,仅仅想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就能够通过类来直接调用方法或使用类的属性。详细而言。static在Java语言中主要有四种使用情况:成员变量、成员方法、代码块、内部类。
(1)static成员变量
尽管Java语言中没有全局的概念,但能够通过statickeyword来达到全局的效果。Java类提供了两种类型的变量:用statickeyword修饰的静态变量和没有statickeyword的实例变量。
静态变量属于类,在内存中仅仅有一个拷贝(全部实例都指向同一个内存地址)。仅仅要静态变量所在的类被载入。这个静态变量就会被分配空间,因此就能够被使用了。对静态变量的引用有两种方式,分别为“类.静态变量”和“对象.静态变量”。
实例变量属于对象,仅仅有对象被创建后,实例变量才会被分配空间,才干被使用。它在内存中存在多个拷贝。
仅仅能用“对象.实例变量”的方式来引用。下面是静态变量与实例变量的使用样例。
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和superkeyword,不能调用非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代码块仅仅会被执行一次。例如以下例所看到的。
|
程序执行结果为:
|
(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(); } } |
程序执行结果为:
|
须要注意的是,仅仅有内部类才干被定义为static。
引申:
(1)什么是实例变量?什么是局部变量?什么是类变量?什么是final 变量?
实例变量:变量归对象全部,仅仅有在实例化对象后才干够。每当实例化一个对象时,会创建一个副本并初始化,假设没有显示初始化,会初始化一个默认值。
各个对象中的实例变量互不影响。
局部变量:在方法中定义的变量,在使用前必须初始化。
类变量:用static可修饰的属性;变量归类全部,仅仅要类被载入。这个变量就能够被使用(类名.变量名)。全部实例化的对象共享类变量。
final变量:表示这个变量为常量,不能被改动。
(2)static与final结合使用表示什么意思?
static常与finalkeyword结合使用,用来修饰成员变量与成员方法。有点相似于“全局常量”。对于变量,假设使用static final修饰。则表示一旦赋值。就不可改动,而且通过类名能够訪问。对于方法。假设使用static final修饰。则表示方法不可覆盖,而且能够通过类名直接訪问。
常见笔试题:
|
输出结果是什么?
A:0 B:1 C:2 D:编译失败
答案:D。
在Java语言中,不能在成员函数内部定义static变量。
出自:http://www.360jobhunting.com/?
p=92