1 static 静态变量
1.1 静态变量的使用
static变量也称作静态变量,也叫做类变量
静态变量被所有的对象所共享,在内存中只有一个副本
当且仅当在类初次加载时会被初始化
静态变量属于类
通过类名就可以直接调用静态变量
也可以通过对象名.静态变量名调用
static 变量
public class Student{ private String name; private static String schoolName; private static int count; public Student(String name){ this.name = name; count++; } public void showStuInfo(){ System.out.println("学生的姓名是" + this.name + ",学校的名字是" + Student.schoolName); } public static void main(String[] args){ Student.schoolName = "实验中学"; Student s1 = new Student("张三"); Student s2 = new Student("李四"); Student s3 = new Student("王五"); s1.showStuInfo(); s2.showStuInfo(); s3.showStuInfo(); System.out.println("学生的数量是:" + Student.count); System.out.println("学生的数量是:" + s1.count); } }
1.2 实例变量和静态变量区别
- 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量;
实例变量属于该类的对象,必须产生该类的对象,才能调用实例变量。
- 静态变量随着类的加载,存在于方法区中;
实例变量随着对象的建立,存在于堆内存中。
- 静态变量在程序开始时创建,在程序结束时销毁;
实例变量在对象创建时创建,在对象被销毁时销毁。
2 静态方法
static修饰的方法,叫静态方法,也叫做类方法
静态方法中,不能直接访问非静态成员变量和非静态成员方法
静态方法中,不能使用 this 关键字
通过类名可以直接调用静态方法
也可以通过对象名.静态方法名调用
静态方法和静态方法访问
public class Student{ private String name; private int age; private int studentId; private static String classRoom; public static void showClassRoom(){ //静态方法中不能使用this关键字 System.out.println("教室3301"); } public static void main(String[] args){ Student.showClassRoom(); } }
3 静态块
3.1 静态块的使用
静态代码块在类加载时执行,并且只执行一次
静态代码块中不能有this关键字
静态块可以有多个,按照顺序执行
public class Emp{ static{ System.out.println("欢迎"); } static{ System.out.println("再次光临"); } }
3.2 静态块、匿名构造块、构造函数
执行顺序
public class Son{ static{ System.out.println("静态块1"); } private String name; public Son(String name){ this.name = name; System.out.println("构造方法"); } { System.out.println("匿名构造块"); } static{ System.out.println("静态块3"); } public static void main(String[] args){ Son s1 = new Son("张三"); Son s2 = new Son("李四"); Son s3 = new Son("王五"); } }
输出如下:
静态块1
静态块3
匿名构造块
构造方法
匿名构造块
构造方法
匿名构造块
构造方法
执行的顺序为:静态块 --> 匿名块 --> 构造方法
4 静态引入
如果我们需要频繁引用某一个类下的方法,比如 java.lang.Math
类下相关的数据计算类,或者是用于进行单元测试的 org.junit.Assert
类下各种用于断言的方法,就可以采用静态引用,从而可以省去对前边类名的重复书写。
import static java.lang.Math.random; import static org.junit.Assert.assertTrue; public class test { public static void main(String[] args) { double random = random(); //Math中的方法 System.out.println(random); assertTrue(random > 0.3); //Assert中的方法 new test().normalMethod(); } //静态引入的方法,在普通方法中同样使用 public void normalMethod(){ double random = random(); System.out.println(random); assertTrue(random > 0.7); } }
通过静态引入的方法,在普通方法和静态方法中,都可以使用。