static关键字 通常来说,创建类的时候,是用new创建此类的对象才可以获得,执行new创建对象时数据存储空间才被分配,其方法才被外界调用 有两种情况用new无法解决: 1)只为某特定域分配单一存储空间,不管创建多少对象 2)希望某个方法不与包含她的类的任何对象实例关联在一起 static初始化: 无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能用于局部变量,只能作用于域。 如果一个域是静态的基本类型域并且没有进行初始化,那就会获得基本类型的标准初值;如果是一个对象的引用,那么默认初始化值是null 类加载顺序:先加载static域,而后是非static域 类加载后,类中的static域在之后的new中将不再初始化,而非static域会再次被初始化 static用法: 随着类的加载而加载,优先于对象出现在内存中,并且不能以任何方式引用this 或super 1.修饰变量。静态字段 静态变量的定义规范:一旦被static修饰的变量,变量名称建议全部大写 当一个类中某个变量被所有对象共享,那么可以将该变量定义为静态变量.静态字段可以直接使用类名调用该方法
1 public class StaticTest01{ 2 public static void main(String[] args){ 3 //PI可以对所有对象共享 4 CArea c1 = new CArea(10); 5 CArea c2 = new CArea(100); 6 double area1 = c1.area(); 7 double area2 = c2.area(); 8 System.out.PRintln("两个圆的面积分别为:"+area1+"~"+area2); 9 System.out.println("圆周率:"+CArea.PI);10 System.out.println("圆周率:"+c1.PI+"~"+c2.PI);11 }12 }13 class CArea{14 public int r;15 public static double PI = 3.14; //圆周率16 public CArea(){}17 public CArea(int r){18 this.r = r;19 }20 public double area(){21 return PI*r*r;22 }23 }24 /*25 结果:26 314~3140027 3.1428 3.14~3.1429 */以上程序,创建了两个CArea对象,这两个对象c1,c2共享一个PI,c1.PI和c2.PI值相同一存储空间,具有相同的值3.14 引用static变量的两种方式:1)如c1.PI; 2)实用类名直接调用:CArea.PI 总结:static作用于某字段时会改变数据创建的方式:因为static字段对每个类来说,无论这个类创建多少个实例,都只有一份存储空间(存储在方法区被所有本类的对象共享),而非静态字段是对每个对象来说都有一份存储空间 2.修饰方法 方法一旦被static修饰,就可以直接使用类名调用该方法 一般将工具类的方法(不需要使用成员变量)定义为static,直接通过类名去调用 静态不能调用非静态,非静态可以调用静态和非静态
1 public class StaticTest02{ 2 public static void main(String[] args){ 3 double area = CArea.area(10); //通过类名CArea去调用静态方法area 4 System.out.println("圆的面积:"+area); 5 } 6 } 7 class CArea{ 8 public int a; //非静态变量 9 public static double PI = 3.14; //圆周率10 public CArea(){}11 public static double area(int r){ //静态方法12 //a = 10; //错误做法。13 return PI*r*r;14 }15 }以上程序,在静态方法area中调用非静态成员变量a是错误做法!!!静态不能调用非静态 static方法的一个重要用法是不创建任何对象的前提下可以直接调用此方法 3.静态代码块 static{语句;} 随着类的加载而加载,加载类时直接运行静态代码块 static代码块只执行一次:当首次生成这个类的一个对象时,或者首次访问数据这个类的静态数据成员时(即便从未生成这个类的对象)
4.修饰类 通常一个普通类不允许被声明为static的,有一个特殊情况:内部类可以被声明为static 当一个内部类被声明为static时,外部类可以直接调用内部类,因为static的内部类是在加载外部类的同时加载的,所以只要实例化外部类后,就能用外部类对象直接调用 静态内部类,而无需实例化内部类。
新闻热点
疑难解答