static关键字

static关键字和静态成员

在声明类的成员——变量和方法——时都可以使用static关键字把成员声明为静态的。静态变量也称为类变量,非静态变量也称为实例变量。静态方法也称为类方法。

静态方法

静态方法也称为类方法,它是属于类的而不是属于对象的。类方法可以直接通过类名来调用而不必先创建一个类。例如我们经常使用的System.out.println()方法就是类方法,我们并没有去创建一个System 对象。Java中定义了于基本类型对应的一些类,如Integer, Byte, Short, Long, Float, Double, Character(对应char)等,它们都有类方法把其它数据类型转化为本身的类型,如Interger.parseInt("200")返回整数200。
规定静态方法在访问本类中的成员时只能访问静态成员,而不能访问非静态成员。因为非静态成员必须先创建对象后调用,这与不先创建对象就调用静态方法矛盾。下例展示用类方法访问实例变量时编译程序出错。

class Hello {
String str ="Hello World";
public static void main(String args[]){
System.out.println(str);
}
}

编译程序报告错误“在静态上下文中不能引用非静态变量”(我使用JS2E版的JDK编译程序的出错信息是中文的)。给变量str 加上static后程序就能通过了。如果把String str ="Hello World" 移到main的内部,当然就没有错误了,但那样str就不是类的成员变量了。

例4 本例展示类方法的使用。

///
// ParseAll.java
public class ParseAll{
int a1; short a2; byte a3; long a4;
float a5; double a6;
public ParseAll() {
a1 = Integer.parseInt("1234");
a2 = Short.parseShort("4403");
a3 = Byte.parseByte("41",16);
a4 = Long.parseLong("123450000");
a5 = Float.parseFloat("3.1416");
a6 = Double.parseDouble("3.14159265");
}
public static void main(String args[]){
ParseAll pa = new ParseAll();
System.out.println(pa.a1);
System.out.println(pa.a2);
System.out.println(pa.a3);
System.out.println(pa.a4);
System.out.println(pa.a5);
System.out.println(pa.a6);
}
}

在构建器中使用了六个类的parseXXX方法给成员赋值,它们都是静态方法。由于a1—a6不是静态的,所以在main方法中创建了对象pa然后有pa.a1来访问。如果把a1—a6定义成静态的,那么就可以直接访问了。

public class ParseAll{
static int a1;
static short a2;
static byte a3;
static long a4;
static float a5;
static double a6;

public ParseAll() {
a1 = Integer.parseInt("1234");
a2 = Short.parseShort("4403");
a3 = Byte.parseByte("41",16);
a4 = Long.parseLong("123450000");
a5 = Float.parseFloat("3.1416");
a6 = Double.parseDouble("3.14159265");
}

public static void main(String args[]){
//new ParseAll();
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
System.out.println(a4);
System.out.println(a5);
System.out.println(a6);
}
}
///

由于a1定义为静态的,所以在类内部可直接访问a1,a2,...。但是程序的输出结果全是0。因为没有调用构建器,变量在声明时又没有赋值,所以自动初始化为0了。如果删除new语句前的注释标记,那么对象被创建了,输出结果就与原来的一样了。

类变量

静态变量也称为类变量,首先,可以不先创建对象就可以访问类变量,例如数学常数Math.PI等都是静态的。其次,类变量数据是属于类的而不是属于对象的,在创建新对象前的静态变量的值在创建后被保留。下面的例子展示了这一点。

例5 统计类创建了多少各新对象。

///
class Counter {
private static int total;
private int number;
Counter() {
total++; number++;
System.out.println("number=" + number + "/total=" +total);
}
}
public class Statistics {
public static void main(String args[]) {
while(Math.random() < 0.9)
new Counter();
}
}
///

运行结果有下面的形式:
number=1/total=1
number=1/total=2
number=1/total=3
number=1/total=4
number=1/total=5

由于使用了随机数Math.random(),每次运行创建的对象个数是不确定的。从结果可以清楚地看出,total在不断地递增,因为它的前一值被保留了。而number总是=1,因为声明时没有初始化就自动赋值为0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值