(1)static 关键字用于修饰变量,方法,和代码块;
(2)被static修饰的变量或方法不依赖于特定对象,可以直接通过类名访问;
static 变量
(1)静态(static)变量与非静态变量的区别是对于一个静态变量由所有对象共同维护,静态变量在内存中只有一个副本;而对于非静态变量,每个对象维护各自的变量副本,互不影响;
static 方法
(1)static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
(2)因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
static 代码块
(1)static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
(2)看Test.java源码,分析输出;程序首先找到main方法入口,创建Test对象前先加载Test类,发现Test类继承Base类,转而加载Base类,加载Base类时,执行static代码块的语句,输出"Base static";继而加载Test类,执行static代码块,输出"Test static";然后创建Test之前,先执行父类的构造函数,输出"Base constructor";最后执行Test的构造函数,输出"Test construntor";
因此输出顺序:Base static , Test static , Base constructor , Test constructor ;
(3)
查看Test.java_2源码,分析输出;首先加载Test类,执行static块,输出"test static";进入main入口,创建MyClass对象前,加载MyClass类,发现MyClass类继承Test类,而Test类已被加载,因此执行MyClass的static代码块,输出"myclass static" ;接下来创建MyClass对象,创建之前必须先初始化父类的成员变量,因此执行Person person=new Person("Test"); 因此加载Person类;执行Person类的代码块,输出"person static";执行Person类的构造函数,输出"person Test";执行父类Test的构造函数,输出"test constructor";初始化自己(MyClass)的成员变量,输出"person MyClass";执行自己的构造函数,输出"myclass constructor";
因此,输出顺序: "test static'" ,"myclass static" , "person static ", " person Test" , " test constructor", "person MyClass ", "myclass constructor";