static关键字被称为静态,可以用来修饰类的属性,方法,代码块,内部类。 特点:
随着类的加载而加载;优先于对象存在;修饰的成员被所有对象共享;可以不创建对象,直接被调用。 注意:如果其中一个对象将静态变量进行了修改,其他的对象的静态变量值跟着改变。 public class Chinese { String name; int age; /** * static 静态变量 当所有对象中的某个属性值都一样时,此属性值可以使用static修饰,在内存中只有一份,被所有对象共享 * 若不使用static修饰,那么会给每个对象复制一份该变量,浪费内存空间 * 特点: * 1.随着类的加载而加载 * 2.优先于对象的存在 * 3.修饰的成员被所有对象共享 * 4.可不创建对象,直接被调用 */ static String country = "中国"; } public class Test { public static void main(String[] args){ //通过类名直接调用,省去创建对象 eg:Math.PI; 不创建对象直接调用 System.out.println(Chinese.country); Chinese zs = new Chinese(); zs.name = "张三"; zs.age = 65; Chinese ls = new Chinese(); ls.name = "李四"; ls.age = 66; //对象名调用静态变量 System.out.println(zs.country); } }当所有对象中的某个属性值都一样时,此属性可以使用static修饰,在内存中只有一份,被所有对象共享,对象名调用静态变量/通过类名调用静态变量,省去创建对象。 static修饰方法,被static修饰的方法也存在方法区,可以直接通过类名调用。 静态方法只能访问静态变量,而成员方法可以访问成员变量和静态变量。
public class StaticMethod { String name; static int age; public static void testStaitc(){ //可以通过类名调用,被static修饰的方法也是存储在方法区 System.out.println("静态方法");//静态方法只能访问静态的变量 } public void test(){ System.out.println("成员方法");//成员方法可以访问成员变量和静态变量 } }代码块:类似于一个没有名称的方法 分为:实例块:每次在创建对象时自动执行。 静态块:类加载时执行
/** * 代码块:类似于一个没有名称的方法 * 1、实例块:每次在创建对象时自动执行 * 2、静态块:类加载时执行 * */ public class Demo { static int num = 10; { System.out.println("这是实例块"); } static{ System.out.println("这是静态块"); } public static void main(String[] args){ /*new Demo(); new Demo();*/ /*这是静态块 * 这是实例块 * 这是实例块*/ /*System.out.println(num); System.out.println(num); System.out.println(num);*/ /*这是静态块 * 10 * 10 * 10*/ } }为什么先打印静态变量和静态方法? 个人理解为:因为静态变量和静态方法随着类的加载而加载,而成员变量和成员方法在创建对象时才被创建。且在一个方法中一个类只加载一次,所以静态变量和静态方法也只被加载一次。