static主要可以修饰:
- 变量
- 方法
- 代码块
- 内部类
- 导入包
static 修饰变量
在class中使用static关键字修饰的变量是class的属性,在class加载时
作用于成员变量用来表示只保存一份副本。
public class Test
{
public static void main(String[] args) {
MyClass myClass1 = new MyClass( );
MyClass myClass2 = new MyClass( );
System.out.println( myClass1.i );
System.out.println( myClass2.i );
}
}
class MyClass
{
public static double i = Math.random( );
}
经过以上程序编译结果显示为:
0.08445234158424719
0.08445234158424719
即在使用static修饰符修饰类中的变量时,该变量可视为“全局变量”,未经修改前不会改变内容。
static 修饰方法
static修饰的方法不需要经过创建类的对象即可直接使用,但是需要注意以下几点:
1.静态方法中不能使用本类的非静态成员变量
public class Test
{
private static String aString = "test";
private String bString = "test";
public static void fun ( )
{
System.out.println( aString );//成功
System.out.println( bString );//编译不通过
}
}
2.在静态方法中不可以使用this或者super等关键字,因为static修饰的方法是在使用前不会创建本类的对象,因此this或者super是空的。
static修饰的代码块会在创建类的时候执行,并且只会执行一次,具体的执行顺序为:静态代码块(只执行一次)-->普通代码块(按照顺序执行)-->构造方法。
package StaticTest;
public class daimakuai
{
{
System.out.println( "我是第一个代码块" );
}
daimakuai ( )
{
System.out.println( "我是构造方法无参" );
}
daimakuai ( int number )
{
System.out.println( "我是构造方法有参" );
}
{
System.out.println( "我是第二个代码块" );
}
static
{
System.out.println( "我是静态代码块" );
}
public static void main ( String[ ] args )
{
new daimakuai( );
System.out.println( "******************我是华丽丽的分割线1*********************" );
new daimakuai( );
System.out.println( "******************我是华丽丽的分割线2*********************" );
new daimakuai( 999999 );
}
}
显示的结果为:
我是静态代码块
我是第一个代码块
我是第二个代码块
我是构造方法无参
******************我是华丽丽的分割线1*********************
我是第一个代码块
我是第二个代码块
我是构造方法无参
******************我是华丽丽的分割线2*********************
我是第一个代码块
我是第二个代码块
我是构造方法有参
注:jvm在使用classloader加载类的时候,会先查看该类是否存在父类,如果存在父类,并且父类中存在静态代码块,就先执行父类的静态代
码块,再执行子类的静态代码块,然后执行父类的普通代码块和子类的普通代码块。
package StaticTest;
/**
* 父类
*
* @author lenovo
*
*/
public class daimakuaiFather
{
{
System.out.println( "我是父类的普通代码块" );
}
daimakuaiFather ( )
{
System.out.println( "我是父类的构造方法无参" );
}
static
{
System.out.println( "我是父类的静态代码块" );
}
}
package StaticTest;
/**
* 子类
*
* @author lenovo
*
*/
public class daimakuai extends daimakuaiFather
{
{
System.out.println( "我是子类的普通代码块" );
}
daimakuai ( )
{
System.out.println( "我是子类的构造方法无参" );
}
static
{
System.out.println( "我是子类的静态代码块" );
}
}
package StaticTest;
<pre name="code" class="plain"><span style="font-family: Verdana, Arial, Helvetica, sans-serif;">public class staticTest</span>
{ /** * @param args */ public static void main(String[] args) { new daimakuai( ); }}
结果为:
我是父类的静态代码块
我是子类的静态代码块
我是父类的普通代码块
我是父类的构造方法无参
我是子类的普通代码块
我是子类的构造方法无参
static 修饰内部类
static修饰的内部类在使用时可以直接通过形如:VariantTest.Inner.Out( );的形式调用内部类Inner中的Out方法,无需实例化该内部类对象。在创建内部类并且经过编译后会出现形如:VariantTest$Inner.class的编译文件,其中 VariantTest是外部类,Inner是内部类。
static 修饰导入包
我们经常会在java项目中导入jar包帮助我们进行程序的编辑,而在import后面加上static就可以直接使用jar包中的静态方法而不用写出类名了。
我们经常会在java项目中导入jar包帮助我们进行程序的编辑,而在import后面加上static就可以直接使用jar包中的静态方法而不用写出类名了。
package StaticTest;
import static java.lang.System.out;
public class staticTest
{
/**
* @param args
*/
public static void main(String[] args) {
out.println( "我是静态导入" );
}
}