一.学生类
先来看三个Student对象:
假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成 员变量,来保存同学上课时的教室呢?
不行!
之前在
Student
类中定义的成员变量,每个对象中都会包含一份
(
称之为实例变量
)
,因为需要使用这些信息来描述 具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,
而是需要让所 有的学生来共享
。
二.定义
引出定义:
在
Java
中,被
static
修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对
象,是所有对象所共享的
。
注意:static成员变量存储在方法区,而普通成员变量存储在堆上,也就是static成员变量独立于对象;
三.static成员变量的特性
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问3. 类变量存储在方法区当中4. 生命周期伴随类的一生 ( 即:随类的加载而创建,随类的卸载而销毁 )
四.static修饰成员方法
一般类中的数据成员都设置为
private
,而成员方法设置为
public
,那设置之后,
Student
类中
classRoom
属性如何 在类外访问呢?
public class Student{ private String name; private String gender; private int age; private double score; private static String classRoom = "Bit306"; // ... }
以上代码中,如何访问classroom?
首先他是private类型的,在类外访问,肯定要提供公共的方法进行修改
但是提供的这个方法也要是static静态成员方法。
在Java 中, 被 static 修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的 。静态成员一般是通过静态方法来访问的。
【
静态方法特性
】
1.
不属于某个具体的对象,是类方法
2.
可以通过对象调用,也可以通过类名
.
静态方法名
(...)
方式调用,更推荐使用后者
3.
不能在静态方法中访问任何非静态成员变量
public static String getClassRoom(){ System.out.println(this); return classRoom; } // 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this
4.静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
五 .static成员变量初始化
1.就地初始化
private static String classRoom = "Bit306";
//此方法为直接初始化
2.静态代码块
在使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
public class Student{ private String name; private String gender; private int age; private double score; private static String classRoom; //实例代码块 { this.name = "bit"; this.age = 12; this.gender = "man"; System.out.println("I am instance init()!"); } // 静态代码块 static { classRoom = "bit306"; System.out.println("I am static init()!"); } public Student(){ System.out.println("I am Student init()!"); } public static void main(String[] args) { Student s1 = new Student(); Student s2 = new Student(); }
执行顺序: 静态代码块-->非静态代码块->不带参的构造方法
1.静态代码块不管生成多少个对象,
其只会执行一次
2
.静态成员变量是类的属性
,因此是在
JVM
加载类时开辟空间并初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行
(
合并
)
4.实例代码块只有在创建对象时才会执行