Math是一个类,但是我们在使用Math的一些函数,比如random()时,不可以通过创建一个对象,再调用对象的方法这种形式,会提示错误信息。因为Math的方法都是静态的,所以无须Math实例,你会用到的是Math类本身,如Math.random()。
java是面向对象编程的,但是也有一些特殊的情况下不需要类实例变量的实用的方法,static就是标记出不需要类实例的静态方法。
以类的名称调用静态的方法:Math.random()
以引用变量的名称调用非静态的方法:song t2=new song(“my way”);t2.play()
静态方法:静态的方法及变量由static标记,并且有main()的类都算有静态的方法
带有静态方法的类通常是不想被初始化的(即无实例变量)
静态的方法(如main())不能使用非静态的变量和方法。
静态变量的值对所有的实例来说都相同,是共享的
防止初始化:将类标记为abstract(为多态创建)
将构造函数进行私有可限制非抽象类被初始化
静态变量只会在类第一次载入的时候初始化:
实例变量:每个实例一个
静态变量:每个类一个
静态变量的初始化有两个保证:
1、在类的任何对象创建之前被初始化(如count,只会有1次初始化)
2、在类的任何静态方法执行之前初始化
java虚拟机加载某个类:
1、有人试图创建该类的新实例、或使用该类的静态方法和变量
2、强制java机去加载(不是很好,可让java机自己选择)
//静态变量初始化的例子
class player{
static int playcount=0;//只会在第一次载入的时候被初始化为0
private String name;
public player(String n){//此为构造函数,每次创建新的实例时被调用
name=n;
playcount++;
}
}
public class playertest{
public static void main(String[] args){
System.out.println(player.playcount);//playcount是静态的,可以用类名调用
player one=new player();
System.out.println(player.playcount);//构造函数调用1次后,playercount值变为1
}
}
final
一个被标记为final的东西,代表它一旦被初始化就不能改变:
final的变量:不能改变它的值
final的方法:不能被覆盖掉
final的类:不能被继承,即不能创建子类
static+final,代表这个变量为常量,常量变量的名称一般用大写字母。