static静态修饰符和类加载

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("读取文章的内容方法");
    }
}

类加载

  • 类加载:

    1. JVM 第一次 读取一个类的时候,会将 .class(字节码文件)读入到内存,这个过程 被称为 类加载
    2. 一个类 最多只会发生 一次类加载, 类加载的产物 是 类对象,用 Class 类型来表示
  • 类加载的过程:

    1. 分配空间
    2. 加载 静态属性,如果有赋值语句,同时完成赋值操作
    3. 加载 静态代码块,并执行代码块中的语句
    4. 如果 有静态属性没有赋值,此时 完成对静态属性的赋值
    5. 将类中的静态方法,全部压入 内存(此时方法是不会执行的)
// 文章测试类
public class ArcticleTest {
    public static void main(String[] args) {
        Arcticle arcticle = new Arcticle();
        Arcticle arcticle2 = new Arcticle();
        /**
         *  同一个类,创建多个对象
         *      1. 普通代码块执行次数与创建对象个数相同
         *      2. 静态代码块只会执行一次
         */
    }
}

static 静态 使用方法及特点

  1. static 修饰的 属性(静态属性)
  2. 静态属性没有特殊需求,不需要私有化
  3. 静态属性 被类的 所有对象 共享,任何一个对象如果对静态属性进行修改,那么所有对象看到的都是修改后的数据
  4. static 修饰 方法(一般多用于工具类的编写)
  5. static 修饰 代码块(做数据的一次性初始化工具)
  6. 静态属性、静态方法 可以使用 类 或者 对象 来调用【推荐类名.静态属性/静态方法】
  7. 空对象引用 可以调用 静态方法 和 静态属性,而不会产生空指针异常
  8. 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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值