什么是静态?
被static修饰的为静态,static可用来修饰变量、方法、内部类、代码块。
注意:
1、static不能用来修饰外部类、接口、抽象类、抽象方法。
2、接口中的变量可以不用明确的声明为静态的,但必须赋值,因为变量默认为public static final。
3、接口中的方法不能被声明为静态的,接口中的方法默认为public abstract,属于抽象方法。
静态与非静态的区别
1、变量
static修饰的变量称为类变量或静态变量,该变量为该类的所有实例所共享;当某个类的实例修改了静态成员变量时,其修改值对该类的其它实例可见。
调用方法:直接通过类名访问
没有static修饰的变量称为实例变量,该变量为该类的各对象独立所有;当某个类的实例修改了非静态成员变量时,其修改值对该类的其它实例不可见。
调用方法:必须创建对象,之后才能访问。
2、方法
情况与变量类似。
3、类
static修饰的类只能是内部类,叫做静态内部类。详见静态内部类详解
ClassA代码:
public class ClassA { public static String s1 = "this is s1 in A"; public String s2 = "this is s2 in A"; }
测试:
public class MainClass { public static void main(String[] args) { ClassA a1 = new ClassA(); System.out.println(ClassA.s1);// this is s1 in A System.out.println(a1.s1);// this is s1 in A System.out.println(a1.s2);// this is s2 in A a1.s1 = "a1 modified s1";// 修改静态变量 a1.s2 = "a1 modified s2";// 修改非静态变量 ClassA a2 = new ClassA(); System.out.println(ClassA.s1);// a1 modified s1 System.out.println(a2.s1);// a1 modified s1 System.out.println(a2.s2);// this is s2 in A } }
从测试中可以看出:
1、在对象a1中修改了静态变量s1,在对象a2中s1的值被改变了;可知当某个类的实例修改了静态成员变量时,其修改值对该类的其它实例可见。
2、在对象a1中修改了非静态变量s2,在对象a2中s2的值没有改变;可知当某个类的实例修改了非静态成员变量时,其修改值对该类的其它实例不可见。
3、静态变量s1可通过ClassA.s1访问,也可以通过a1.s1访问,其结果是一样的;可知静态变量并不依赖与实例,可直接通过类名进行访问。
4、非静态变量s2只能通过对象进行访问;可知非静态变量依赖于实例,访问前必须先创建实例。