static修饰的属性和方法就是静态属性和静态方法。
普通属性 / 普通方法 都绑定着一个隐含的对象 (this),static含义就是和对象解绑,
静态属性不再保存在对象(堆区)中,而是保存在类(方法区)中。
注意:静态方法调用时,没有隐含着的对象,所以也就无法使用this关键字。
一个类的所有的对象,是可以共享静态属性的。(可以适当看作C语言的全局变量)
访问静态属性/调用静态方法语法:
类名称.属性名称;
类名称.方法名称(实参列表);
public class Test{
int a=1;//普通属性
static int b=2;//静态属性
public static void main(String[] args){//静态方法
System.out.println(a);//不能访问普通属性
System.out.println(b);//可以访问静态属性
}
静态方法不能直接访问普通属性,可以创建对象访问.而普通方法可以直接访问静态属性和普通属性。
public class Test{
int a=1;//普通属性
static int b=2;//静态属性
public static void main(String[] args){//静态方法
Test p = new Test();
System.out.println(p.a);
System.out.println(b);
}
静态属性和非静态属性的区别:
1、静态属性静态方法都存放在内存中的方法区 而普通属性存放在内存中的堆区
2、静态属性或方法在没创建对象之前就已经存在 而非静态属性在创建对象之后才存在
3、一个类的所有的对象,是可以共享静态属性的。
4、 静态属性在类消失之后才销毁 而非晶态属性在对象销毁之后才销毁的
5、静态属性可以通过类名直接访问 非静态属性不能通过类直接访问只能通过对象访问
属性的初始化(发生在生命周期的第二阶段,对象实例化的时候)
1)定义时初始化 int a=10;
2)构造代码块
{
a=10;
}
3)构造方法中初始化
Person(){
a=10;
}
1)和2)先执行 ,3)最后执行
构造方法初始化写在前也最后执行
静态属性的初始化
1)static int a=10; 1)和2)按照定义顺序依次执行
2)静态构造代码块
static{
a=20;
}
先初始化静态属性再普通属性。
由以下代码验证:
public class A {
A() {
System.out.println("构造方法中,a = 30");
a = 30;
}
{ System.out.println("构造代码块 1时,a = 0"); a = 0; }
int a = init();
{ System.out.println("构造代码块 2时,a = 20"); a = 20; }
int init() {
System.out.println("定义时 a = 10");
return 10;
}
static {
System.out.println("静态代码块 1时,staticA = 100");
staticA = 100;
}
static int staticA = staticInit();
static {
System.out.println("静态代码块 2时,staticA = 300");
staticA = 300;
}
static int staticInit() {
System.out.println("静态定义时 staticA = 200");
return 200;
}
public static void main(String[] args) {
A p = new A();
A q = new A();
}
}