一:static特殊关键字用处
二:静态变量:类共有成员
–static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在。
–所有的对象实例,对于静态变量都共享存储在一个共同的空间(栈)
class Potato{
static int number=15;
public void setnumber(int n) {
this.number=n;
}
}
public class StaticTest {
public static void main(String[] args) {
System.out.println(Potato.number); //一:直接类名.静态变量名
Potato p=new Potato();
p.setnumber(20);
System.out.println(Potato.number);
System.out.println(p.number); //二:对象调用静态变量
Potato p2=new Potato();
p2.setnumber(30);
System.out.println(Potato.number);
System.out.println(p.number);
System.out.println(p2.number); //三:不同对象调用的是同一块内存区域,操作一块区域
}
}
不同于C++,在C++中静态变量要么只能通过类名.静态变量或者静态方法访问。
但是在java中静态变量可以通过对象实例来修改和获取,共享的是同共有内存块,不过生命周期要长于对象实例
其生命周期从类声明开始到程序结束,对象则是从实例化开始,对象消失结束
三:static静态方法
–静态方法也无需通过对象来引用,而通过类名可以直接引用。
–在静态方法中,只能使用静态变量,不能使用非静态变量。
–静态方法禁止引用非静态方法。
class Potato{
static int number=15;
public void setnumber(int n) {
this.number=n;
}
public static int getnumber() {
//return this.number; this代表当前对象,static方法只允许访问静态成员,不可以访问对象数据
return number;
}
}
public class StaticTest {
public static void main(String[] args) {
int val;
System.out.println(Potato.number);
Potato p=new Potato();
p.setnumber(20);
val=p.getnumber(); //可以通过对象访问静态方法
System.out.println(val);
val=Potato.getnumber(); //可以通过类直接访问静态方法
System.out.println(val);
}
}
四:static代码块
–只在类第一次被加载时调用。
–换句话说,在程序运行期间,这段代码只运行一次。
–执行顺序:static块 > 匿名块 > 构造
public class Employee {
//实例域初始化块
private int age;
private float salay;
private boolean sex;
private String name; //char name[]可以
static
{
//.... 静态初始化块,会在对象构造前执行
System.out.println("static block");
}
{ //对象初始化块
System.out.println("object block");
}
public Employee() {
System.out.println("construct block");
}
}
static block //先执行类静态块,执行一次
object block //每一次对象构造前都会先执行对象初始化块,放在构造方法后面也是先执行与构造方法
construct block //之后执行构造方法
object block
construct block
五:总结
–static变量:不管有多少个对象,内存中只有一份
–static方法:可以用类名直接引用,无需new对象来引用
–static块:static块只执行一次,并且static块 >匿名块>构造