首先Static修饰的变量是放在方法区内存空间中的,在运行时Static方法先赋值然后才是main方法的执行,在类加载的时候就对Static修饰的变量进行了赋值。总之被Static修饰的都会在类加载的时候执行,也是按照自上而下顺序执行。main方法在类加载后才会执行。Static修饰的静态代码块只能执行静态的东西。静态方法和静态变量需要通过类名或对象来访问(实际上都是通过类名.来访问),静态方法只能在静态代码块中执行或者main方法中调用。
StaticTEST
public class StaticTest {
static{
System.out.println("Hello!");//在静态代码块中输出
}
private static int i=100;//定义了一个被static修饰的int型i
public static void main(String[] args) {
System.out.println("i ="+i);//在main方法中打印出i
int i= 10;//在main方法中定义一个局部变量i;
System.out.println("i ="+i);
Dayin();//调用Dayin方法
}
public static void Dayin()
{
System.out.println("i ="+i);
}
static {
System.out.println("Hello everyone!");
}
}
//运行结果:
因为静态代码块实在类加载的时候就执行了并且同样按照顺序执行所以先输出了"Hello!"再输出了"Hello everyone!"同时给i赋值了100。然后进入main压栈,首先打印了i是100,之后定义了一个局部变量i赋值为10接着打印了i是10,最后调用静态方法Dayin但此时这个方法中的i是静态的所以值是100,其实main方法中打印了两个i并不是一样的一个是定义在类中的存在方法区内存中而另一个只是定义在main方法中的局部变量。
实例代码块
public class Test {
public Test()
{
System.out.println("执行构造方法");//Test类的构造方法
}
{
System.out.println("这是一个实例代码块!");
}
static int i;//定义一个静态整型变量i
public static void main(String[] args) {
System.out.println("Hello!");
Test t1=new Test();//创建一个Test类的对象
}
{
System.out.println("i ="+i);
}
}
//运行结果:
实例代码块在构造方法执行之前执行,构造方法每执行一次,实例代码块就会被提前执行一次。同样实例代码块也是顺序执行的。
2、无参构造方法及作用
无参构造方法一般是用来初始化对象和给变量赋初值等的。无参构造方法可写可不写但你如果不写java会给一个默认的无参构造方法。但当你写了有参构造方法的时候,就必须写一个无参构造方法。此时java不会给默认的无参构造方法,如果没有无参构造方法那么就会报错,无参构造方法是为了new出对象。PS:继承中子类的构造方法都是默认调用父类的无参构造方法。
public class WCGZ {
private int num;
private String name;
public WCGZ(int num,String name)
{
System.out.println("num ="+num);
System.out.println("name ="+name);
}
public static void main(String[] args) {
WCGZ s1 =new WCGZ(1,"李白");
WCGZ s2 =new WCGZ();
}
}
正确代码如下:
public class WCGZ {
private int num;
private String name;
public WCGZ(int num,String name)
{
System.out.println("num ="+num);
System.out.println("name ="+name);
}
public WCGZ()
{
System.out.println(num);
System.out.println(name);
}
public static void main(String[] args) {
WCGZ s1 =new WCGZ(1,"李白");
WCGZ s2 =new WCGZ();
}
}
运行结果如下:
num =1
name =李白
0
null



