static修饰变量
static 变量--不依赖与对象,通过类来直接调用,与类中其他成员变量不同,static修饰的变量存放在方法区,其性质与常量相似,不能再被修改。
运行结果:
package TestStatic;
public class A {
private int x;
public static int num;
//构造方法初始化
public A(){
this.x=0;
num=0;
}
}
package TestStatic;
public class Test {
public static void main(String[] args) {
A a1=new A();
A a2=new A();
A.num++;
System.out.println(A.num);
a1.num++;
System.out.println(a1.num);
a2.num++;
System.out.println(a2.num);
System.out.println("*************************");
a1.x++;
System.out.println(a1.x);
a2.x++;
System.out.println(a2.x);
}
}
这是因为被static修饰的变量num在方法区中共享一块内存,每次都对同一个num进行操作;而普通成员变量x则是依赖于对象,每一个对象拥有一个自己的x,这个x不共享给其他对象。
static修饰方法
几条规则:
1.静态方法不依赖于对象,直接用类.静态方法调用
2.静态方法中不能调用非静态方法或者变量,不能用this,因为非静态成员变量和非静态方法需要依靠对象来调用;除非在静态方法中创建对象,再用对象调用。
3.静态方法/非静态方法 中 都可以调用静态变量和静态方法。
4.一定注意:main方法是静态方法
如图,display()和name都报错,因为它们是成员方法和成员变量,需要依靠对象来调用。
而非静态方法里面可以调用静态方法,如下图:
代码块
1.静态代码块:static{
用于初始化静态变量
}
静态代码块首先执行,且只会执行一次。
2.实例化代码块:{
一些内容
}
实例化代码块第二个执行。
3.构造方法:public 类名(参数或者无参){
完成对成员变量的初始化
}
构造方法最后执行。
注:同等级的方法之间调用顺序取决于写代码的顺序。如:写了两个静态代码块,谁写在前面谁就先执行。
package TestStatic3;
public class C {
private int x;
private static int y;
//构造方法
public C(int m_x,int m_y){
this.x=m_x;
this.y=m_y;
System.out.println("构造方法正在被调用,,,");
System.out.print("x="+x+" "+"y="+y);
System.out.println();
}
//静态代码块
static{
C.y=0;
System.out.println("静态代码块正在被调用...");
System.out.print("y="+C.y);
System.out.println();
}
//实例化代码块
{
System.out.println("实例化代码块正在被调用...");
}
}
package TestStatic3;
public class Test {
public static void main(String[] args) {
C tmp=new C(5,4);
System.out.println("*****************");
C tmp2=new C(3,6);
}
}
运行结果:
如图,即使创建了两个对象,静态代码块只会被调用一次,并且静态代码块中没法修改非静态变量,因为静态代码块不依赖对象而非静态成员变量依赖于对象调用,但是静态代码块中可以修改静态变量。其次可以看出,构造方法总是最后一个被调用。