首先两个常识:
在Java中public class中的public static void main(String [] args){}这个方法是程序执行的入口;
一般情况下类中的方法调用是和类的实例有一种依赖关系,而且方法一般是不能独立于类实例二存在的。
所以很多情况下我们都会new出一个类的实例对象,然后通过这个实例对象来调用我们需要用到的方法。但是在很多情况下,我们会希望这样的情况:
(1)不管我们创建多少个实例对象,我们希望这个类中的某些代码始终只有一部分。
(2)我们希望某些方法可以不依赖于类的实例,我们不通过创建实例对象也能完成对这个方法的调用。
对于这两个情况,我们看下面的代码:
public class StaticTest {
public static void main(String [] args)
{
//对于Class2,分别创建两个实例对象
Class2 cs21 = new Class2();
Class2 cs22 = new Class2();
//分别对类中的属性count进行重新赋值
cs21.count2 = 2;
cs22.count2 = 3;
//通过输出我们可以看到,两是实体对象中的值不一样
System.out.println(cs21.count2);
System.out.println(cs22.count2);
//调用其中的方法
cs21.show();
cs22.show();
//直接使用类中的方法
Class3.show();
//创建两个Class3的实例对象
Class3 cs31 = new Class3();
Class3 cs32 = new Class3();
//对其中的属性值重新赋值
cs31.count3 = 2;
cs32.count3 = 3;
//输出值,看比较。
System.out.println(cs31.count3);
System.out.println(cs32.count3);
}
}
class Class2{
public int count2 = 1;
public void show()
{
System.out.println("just a common function of Class2.");
}
}
class Class3{
public static int count3 = 1;
public static void show()
{
System.out.println("just a common function of Class3.");
}
}
对上面代码进行分析,对于Class2这个类而言,我们想使用它里面的属性或者方法,都必须创建这个类的实例,否则是不能调用的,而且两个实例对象中的属性和方法相互独立,互不干扰,也就是说我们创建几个实例对象,这个类中的属性和方法就有几份。而对于Class3这个类而言,我们不需要创建这个类的实例就可以直接访问它里面的属性和方法,通过类名.属性或者类名.方法这样的形式,同事我们创建了两个实例对象,对里面的属性值修改后发现两个实例对象中的属性值是一样的,这说明在有了static修饰之后,不管创建多少个实例对象,里面static修饰的变量或者方法都只有一份。
然后我们再看下面的例子:
public class StaticTest {
public static void main(String [] args)
{
//第一次创建实例
InitOrderSun ios1 = new InitOrderSun();
//第二次创建实例
InitOrderSun ios2 = new InitOrderSun();
}
}
class InitOrder{
InitOrder()
{
System.out.println("父类构造器中的可执行语句。");
}
public static void put()
{
System.out.println("父类静态方法中的可执行语句。");
}
static
{
System.out.println("父类类中的静态代码块。");
}
{
System.out.println("父类类中的非静态代码块。");
}
}
class InitOrderSun extends InitOrder{
InitOrderSun()
{
System.out.println("子类中构造器中的可执行语句。");
}
public static void putSun()
{
System.out.println("子类静态方法中的可执行语句。");
}
static
{
System.out.println("子类中的静态代码块。");
}
{
System.out.println("子类中的非静态代码块。");
}
}
通过对上面的代码的执行分析后,我们可以知道:在一个类的实例创建中,static修饰的代码块是先于其他的代码块最先执行的,而且不管创建多少个实例对象,静态代码块的初始化只有一次。
通过总结,我们可以知道static的作用有如下几点:
(1)在没有任何实例对象的前提下,仅仅通过类本身就可以调用static方法;
(2)不管创建多少个实例对象,static修饰的属性和方法只有一份;
(3)创建类的对象的时候,初始化的顺序——static是最先被初始化的;
(4)不管创建多少个对象,static代码块只初始化一次。