static 静态
static 静态修饰符 修饰的内容 和 对象没有关系,而是和 对应的类有关系
1. static 可以修饰 内部类
2. static 可以修饰 属性 ,称为 类属性
3. static 可以修饰 代码块
4. static 可以修饰 方法 , 称之为 类方法
/**
* 文章类
*/
public class Arcticle {
/**
* 文章的阅读量
*/
public int num = 1;
public static int count = 2;
{
System.out.println("普通代码块"+num+" "+count);
}
static{
//System.out.println(num);加载静态代码块与类加载同时,此时非静态num还未创建
// 静态代码块中不能使用成员属性
System.out.println("静态代码块"+count);
}
public void read1(){
System.out.println("读取文章的内容方法");
}
public static void read2(){
//System.out.println(this);this代表当前对象,加载静态方法的时候对象还未出现
System.out.println("读取文章的内容方法");
}
}
类加载
-
类加载:
- JVM 第一次 读取一个类的时候,会将 .class(字节码文件)读入到内存,这个过程 被称为 类加载
- 一个类 最多只会发生 一次类加载, 类加载的产物 是 类对象,用 Class 类型来表示
-
类加载的过程:
- 分配空间
- 加载 静态属性,如果有赋值语句,同时完成赋值操作
- 加载 静态代码块,并执行代码块中的语句
- 如果 有静态属性没有赋值,此时 完成对静态属性的赋值
- 将类中的静态方法,全部压入 内存(此时方法是不会执行的)
// 文章测试类
public class ArcticleTest {
public static void main(String[] args) {
Arcticle arcticle = new Arcticle();
Arcticle arcticle2 = new Arcticle();
/**
* 同一个类,创建多个对象
* 1. 普通代码块执行次数与创建对象个数相同
* 2. 静态代码块只会执行一次
*/
}
}
static 静态 使用方法及特点
- static 修饰的 属性(静态属性)
- 静态属性没有特殊需求,不需要私有化
- 静态属性 被类的 所有对象 共享,任何一个对象如果对静态属性进行修改,那么所有对象看到的都是修改后的数据
- static 修饰 方法(一般多用于工具类的编写)
- static 修饰 代码块(做数据的一次性初始化工具)
- 静态属性、静态方法 可以使用 类 或者 对象 来调用【推荐类名.静态属性/静态方法】
- 空对象引用 可以调用 静态方法 和 静态属性,而不会产生空指针异常
- null 不能 调用静态属性/静态方法(重点不在空null,而是对象引用的类)
狗类
public class Dog {
// 定义一个所有的小狗家
public static String house = "狗公寓001";
// 小狗的名字
public String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public static void a(){
System.out.println("静态方法");
}
}
狗测试类
public class DogTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("大黄");
Dog dog1 = new Dog();
dog1.setName("大白");
dog.house = "狗公寓002";
// 获取 第一条小狗的 狗窝位置
System.out.println(dog1.getName()+"的狗窝在"+dog.house);
System.out.println(dog.getName()+"的狗窝在"+Dog.house);
System.out.println(dog1.getName()+"的狗窝在"+dog1.house);
Dog dog2 = null;
System.out.println(dog2.house);
// 调用静态属性、方法 与类型有关,和值无关 最好 类名.属性/方法 调用
//System.out.println(null.house);报错
dog2.a();
}
}