类和对象 - static
类:
- 是静态方法/静态属性的集合
- 用来构造对象的模板
Static
修饰属性 : Java静态属性和类相关,和具体的实例相关。换句话说,同一个类的不同实例共用同一个静态属性。
修饰方法:如果任何方法上应用static关键字,次方法称为静态方法。
1.静态方法属于类,而不属于类的对象。
2.可以直接调用静态方法,而无需创建类的实例。
3.静态方法可以访问静态数据成员,并可以更改静态数据成员的值。
注意事项1: 静态方法和实例无关, 而是和类相关. 因此这导致两个情况:
1.静态方法不能直接使用非静态数据成员或者调用非静态方法(非静态数据成员和方法都是和实例相关的)
2.this和super两个关键字不能在静态上下文中使用 (this是当前实例的引用,super是当前实例父类实例的引用,)
代码示例 :
public class Teacher {
// 把类用于实例化对象的模板 —— 都不被 static 修饰
// 一直在和 Teacher 对象有关
public String name; // 某个老师(对象),它有它的名字
public int age; // 某个老师(对象),它有它的年龄
// 构造方法用于构造某个老师(对象)
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
// 某个老师(对象)自我介绍
public void introduce() {
System.out.printf("我是 %s,我今年 %d 岁\n", name, age);
}
// 把类用于静态属性和静态方法的集合 —— 都被 static 修饰
public static int countOfTeacher = 0;
// 超脱于一个个老师(对象)之上的,和 Teacher 对象无关的
// 也和 Teacher 对象无关
public static String buildTeacher(String name) {
countOfTeacher++;
return name;
}
// 也和 Teacher 对象无关
public static int getCountOfTeacher() {
return countOfTeacher;
}
}
public class TeacherTest {
public static void main(String[] args) {
// 针对 Teacher 作为对象模板的用法
Teacher a = new Teacher("AAA", 1);
a.introduce(); // 通过指向 Teacher 对象的引用去调用
// 针对 Teacher 用户静态的集合
// 使用类名调用,和对象无关
int b = Teacher.countOfTeacher;
System.out.println(b); // 0
System.out.println(Teacher.buildTeacher("Hello")); // "Hello"
System.out.println(Teacher.countOfTeacher); // 1
System.out.println(Teacher.getCountOfTeacher()); // 1
System.out.println(Teacher.buildTeacher("world")); // "world"
System.out.println(Teacher.countOfTeacher); // 2
System.out.println(Teacher.getCountOfTeacher()); // 2
}
}
整个程序的运行过程中,有且仅有一份类 类型的“对象”
在静态上下文(静态方法)中,不能使用非静态属性和非静态的方法 。(静态上下文中没有this)非静态属性和非静态的方法通过this访问
在普通上下文(普票方法)中,可以使用静态属性和静态方法 。使用静态属性和静态方法 通过类名方法
写代码时的原则:
如果,方法的执行过程中,需要用到this,就必须不加static
否则,方法的执行过程中,不会用到this,可以加可以不加。
关于静态属性的初始化
- 定义时初始化
- 静态代码块
按照书写顺序执行
静态属性初始化的时机:
发生在类被加载的期间