静态属性
在类中(方法之外),用static修饰的变量我们称之为静态变量或类变量。
注意:static不能用于修饰局部变量!!!
- 静态变量特点
- 一个类中,静态变量只有一份,可以被该类和该类的对象所共享。
- 我们可以通过 类名.静态变量 或 对象.静态变量 来操作静态变量。
- 静态变量优先于对象存在,它随着类的加载就已经存在了
静态变量内存图:
【示例】静态变量的使用示例
class Student { // 成员变量 String name; // 静态变量 static String classRoom; // 构造方法 public Student(String name) { this.name = name; } } public class StaticVariableDemo { public static void main(String[] args) { // 通过类名,操作静态变量(推荐使用) System.out.println(Student.classRoom); // 输出:null Student.classRoom = "WH8527"; // 给静态变量赋值 System.out.println(Student.classRoom); // 输出:"WH8527" // 创建对象操作 Student stu = new Student("小明"); // 通过对象,操作静态变量(不建议使用该方式) stu.classRoom = "WH8528"; // 给静态变量赋值 System.out.println(stu.classRoom); // 输出:"WH8528" } } |
静态变量和成员变量区别
区别一:生命周期不同
成员变量--随着对象的创建而创建,随着对象的回收而释放。
静态变量--随着类的第一次加载而存在,随着类的消失而消失。
(所以不要随便滥用static资源,防止出现JVM内存不够的情况!)
区别二:调用方式不同
成员变量--只能被对象调用。
静态变量--可以被类名调用,也可以被对象调用。
区别三:数据存储位置不同
成员变量--存储在堆中,也称为对象的特有数据。
静态变量--存储在方法区(共享数据区)的静态区,也称为对象的共享数据。
区别四:创建次数不同
成员变量--可以创建任意多次,每创建一次对象就创建了一次成员变量。
静态变量--只能创建一次,被该类和该类的对象所共享。
静态方法
在类中,用static修饰的方法我们称之为静态方法或类方法。
静态方法特点
- 静态方法优先于对象存在,静态方法随着类的加载就已经存在了。
- 我们可以通过 类名.静态方法() 或 对象.静态方法() 来调用静态方法。
【示例】静态方法使用示例
class Student { // 成员变量 String name; // 构造方法 public Student(String name) { this.name = name; } // 静态方法 public static void study() { System.out.println("good good study, day day up"); } } public class StaticMethodDemo { public static void main(String[] args) { // 使用类名调用静态方法 Student.study(); // 实例化一个对象 Student stu = new Student("小明"); // 使用对象来调用静态方法 stu.study(); // 不建议使用! } } |
静态方法和成员方法的区别
区别一:访问变量区别
成员方法--既能访问成员变量,又能访问静态变量。
静态方法--只能访问静态变量,不能访问成员变量,因为对象可能还未初始化。
区别二:访问方法区别
成员方法--既能访问成员方法,又能访问静态方法。
静态方法--只能访问静态方法,不能访问成员方法,因为对象可能还未初始化。
区别三:访问this区别
成员方法中可以访问this。
静态方法中不能访问this,因为对象可能还未初始化。
静态代码块--JDBC
静态代码块
定义:在类中,用static修饰的代码块叫做静态代码块
作用:主要用于给类做初始化操作!
静态代码块特点:
1)静态代码块只能定义在类里面,独立于任何方法,不能定义在方法里面
2)一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行(从上到下)。
3)静态代码块中的变量都是局部变量,只能访问类的静态变量,而不允许访问成员变量。
4)静态代码块会在类被加载时自动执行,并且只执行一次!
【示例】静态代码块示例
class StaticBlockDemo { String name; static String sex; static { // 只能访问类的静态变量,而不允许访问实例变量 // name = "小明"; 编译错误 sex = "男"; System.out.println("11"); } } |
构造代码块
定义:在类中,没有用static修饰的代码块叫做构造代码块(非静态代码块)
作用:
主要用于给所有对象共性特点进行初始化操作!
可以将各个构造方法中公共的代码提取到构造代码块。
匿名内部类不能提供构造方法,此时初始化操作可以放到构造代码块中。
构造代码块的特点:
1)构造代码块只能定义在类里面,独立于任何方法,不能定义在方法里面。
2)一个类中允许定义多个构造代码块,执行的顺序根据定义的顺序进行。
3)构造代码块中的变量都是局部变量,既可以访问静态变量也可以访问实例变量。
4)构造代码块随着对象的创建而加载,每创建对象一次就执行一次!
【示例】构造代码块
class BlockDemo { String name; static String sex; { // 可以访问静态变量也可以访问实例变量 name = "小明"; sex = "男"; } } |
代码执行顺序
静态代码块—>非静态代码块—>构造方法
【示例】演示代码执行顺序
class Student { static int num; static { System.out.println("静态代码块执行 num:" + ++num);//1 } { System.out.println("构造代码块执行 num:" + ++num);//2 } public Student() { System.out.println("无参构造方法在执行 num:" + ++num);//3 } public Student(int number) { this(); System.out.println("有参构造方法在执行 num:" + ++num);//4 } } public class BlockDemo { public static void main(String[] args) { new Student(3); new Student(); } } |
运行结果: