一、static静态修饰符
static修饰符能够修饰属性,方法,初始代码块,不能修饰局部变量和类。
静态的变量叫常量,非静态的变量叫实例变量。
1、修饰属性
package gc.test.java.cs2; public class Info{ public static String NAME = "张三"; public String addr = "湖北武汉"; }
package gc.test.java.cs2; public class Main { public static void main(String[] args) { Info info1 = new Info(); System.out.println("name:" + info1.NAME); System.out.println("addr:" + info1.addr); info1.NAME = "李四"; info1.addr = "北京"; Info info2 = new Info(); System.out.println("name:" + info2.NAME); System.out.println("addr:" + info2.addr); } }
运行结果:
name:张三
addr:湖北武汉
name:李四
addr:湖北武汉
通过上面的运行结果可以看出,Info在第一次被实例化之后,修改Info中的静态变量NAME和变量addr,在第二次实例化之后,静态变量NAME被修改了,但是变量addr被初始化了。可以看出,静态变量是所有实例对象共享的,它属于类,不属于某个实例对象。
2、修饰方法
package gc.test.java.cs2; public class Info{ public static String NAME = "张三"; public String addr = "湖北武汉"; public String sex = "男"; public static void showName(){ System.out.println("我的名字叫" + NAME); } public static void showAddr(){ System.out.println("我住在" + addr);//编译错误 } public void showSex(){ System.out.println("我是" + sex + "生"); } }
package gc.test.java.cs2; public class Main { public static void main(String[] args) { Info.showName(); //Info.showSex();//编译错误 Info info = new Info(); info.showSex(); } }
上面代码中出现第一处编译错误的地方,可以看出静态方法只能访问静态成员。
在第二处出现编译错误的地方,可以看出非静态方法只能通过实例化对象来调用,而静态方法可以直接通过类名.方法名来调用。
package gc.test.java.cs2; public class Info{ public static String NAME = "张三"; public String addr = "湖北武汉"; public String sex = "男"; public static void showName(){ String name = this.NAME;//编译错误 System.out.println("我的名字叫" + NAME); } public void showSex(){ String name = this.NAME; System.out.println("我是" + sex + "生"); } }
上面代码中,一个静态方法和一个非静态方法中,同时使用了this关键字,在静态方法中出现编译错误。
package gc.test.java.cs2; public class Info{ public static void showName(){ } public void showSex(){ } }
package gc.test.java.cs2; public class Member extends Info{ public static void showName(){ } public void showSex(){ } }
上面代码中是编译正常,如果将Member中的代码改为
package gc.test.java.cs2; public class Member extends Info{ public void showName(){//编译错误 } public static void showSex(){//编译错误
}
}
可以看出,静态方法只能重写静态方法,非静态方法只能重写非静态方法。
3、修饰代码块
package gc.test.java.cs2; public class Info{ Info(){ System.out.println("Info的无参构造函数"); } static{ System.out.println("Info中的静态代码块"); } }
package gc.test.java.cs2; public class Main { public static void main(String[] args) { Info info = new Info(); } }
运行结果:
Info中的静态代码块
Info的无参构造函数
通过上面的结果,可以看出,静态代码块在实例化对象的时候就执行了,而且执行顺序是在无参构造函数之前。