在上几篇博文中我们知道,当我们编写一个类时,实际上就是在描述该类对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。但有时候,我们希望无论是否产生了对象或无论产生了多少个对象的情况下,某些特定的数据在内存空间里只有一份,那么此时static关键字就派上用场了。
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)
一、static关键字
1.静态成员变量/方法
在类成员(变量/方法)前加上一个static关键字,那么这个成员就称为了静态成员变量/方法。静态变量在某种程度上与其他语言的全局变量相类似,如果该静态成员变量不是私有的就可以在类的外部进行访问,此时不需要产生类的实例对象,只需要类名(类名.静态成员)就可以引用。
2.static关键字的用法
用static标识符修饰的变量,它们在类被载入时创建,只要类存在,static变量就存在。由于静态成员变量能被各实例对象所共享,所以我们可以用他来实现一些特殊效果。
(1)静态代码块
形式:static{.......}
一个类中可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行依次,所以静态块常用来进行类属性的初始化。
源码:TestStatic.java
class staticCode {
static String school;
static{
school="大学城大学"; //静态成员变量赋值
System.out.println("I am staticCode");
}
}
public class TestStatic {
static
{
System.out.println("TestStatic is loading...");
}
public static void main(String[] args)
{
System.out.println("In the main thread");
new staticCode();
new staticCode();
}
}
打印信息:
分析:观察程序打印的信息,我们可以得出以下几点结论。
a.类staticCode中的静态代码块被自动执行,尽管产生了类的staticCode的两个实例对象,但其中的静态代码块只被执行一次并且只有在类被使用时才会执行类中的的静态代码块;
b.类在第一个被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。
(2)单态类设计
首先我们了解下类的单态设计模式,即采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
//单态类
class TestSingle
{
private TestSingle(){} //私有构造方法
private final static TestSingle single = new TestSingle(); //构造TestSingle一个私有实例对象
public static TestSingle getSingleInstance() //返回该私有对象
{
return single;
}
}
然后,我们在主线程中就可以通过TestSingle.getSingleInstance()方法来获取该单态类唯一的对象。
源码:staticDemo.java
//单态类
class TestSingle {
private TestSingle(){} //私有构造方法
private final static TestSingle single = new TestSingle(); //构造TestSingle一个私有实例对象
public static TestSingle getSingleInstance() //返回该私有对象
{
return single;
}
public void print()
{
System.out.println("I am TestSingle class");
}
}
//主类
public class staticDemo
{
public static void main(String[] args)
{
System.out.println("In main thread ");
TestSingle single=TestSingle.getSingleInstance(); //创建单态类对象
single.print(); //调用单态类中的公共方法
}
}
打印信息:
分析:如果要让类在一个虚拟机中智能产生一个对象,我们可以使用static去设计一个单态类
a.首先必须将类的构造方法的访问权限设置为private,这样的话就能能用new操作符在类的外部产生类的对象了,当然我们在类的内部仍然可以产生该类的对象。
b.在单态类中使用new操作符产生一个实例对象,且该实例对象为静态私有的,只能被本类的静态方法使用
c.由于我们无法在类的外部还无法得到该单态类的对象,所有我们在单态类中实现一个静态方法用以返回该内部创建的对象。需要注意的是:静态方法只能访问类中的静态成员变量哦。
3.使用static关键字注意事项
(1)在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。因为对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
(2)静态方法不能以任何方法引用this和super关键字。因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时this所引用的对象根本就没有产生。
(3)main()方法是静态的,隐藏JVM在执行main方法时不创建main方法所在的类的实例对象。因而在main()方法中,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。
二、final关键字
我们在编写Java代码时,时常看到在Java中声明类、属性和方法时,使用关键字final来修饰。下面我们就来学习下final关键字到底有些什么作用?
1.final标记的类是不能被继承的;
2.final标记的方法不能被子类重写;
3.final标记的变量,无论是成员变量还是局部变量,即成为常量,只能被赋值一次。另外,final标记的成员变量必须在声明的同时或在该类的构造方法中显示赋值后才能使用。
class Test
{
final int x=3;
}
或者:
class Test
{
final int x;
Test()
{
x=3;
}
}
注意:
(1)final标记的变量(成员变量或局部变量)即成为常量,只能对其赋值依次,但这个"常量"也只能在这个类的内部使用,不能在类的外部直接使用。
(2)在Java中定义常量,通常使用public static final来标记这个常量,然后这个常量就成了全局的常量。但是,这样定义的常量只能在定义时赋值,即使在构造函数里面也不能对其进行赋值。