你真的了解static吗?

目录

  • 一.static
    • 1.概念
    • 2.存在形式
    • 3.访问形式
    • 注意
    • 4.static成员变量的初始化
      • 4.1就地初始化
      • 4.2使用代码块初始化
    • 5.关于main
  • 二.代码块
    • 概念
    • 1.普通代码块
    • 2.构造代码块
    • 3.静态代码块
    • 注意事项
      • ①加载形式
      • ②加载顺序

一.static

1.概念

在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。
被static修饰的成员变量不属于对象,而是属于类

你真的了解static吗?_第1张图片

你真的了解static吗?_第2张图片

在如上图中的代码里我们可以发现,zhangsna,wangwu,lisi三人的教室属性相同,而重复的操作提升了代码量,那我们可以不可以将相同的属性在类中提前声明,使得类中的所以对象都包含该属性,不再写重复的代码呢?这时我们就引出了static

你真的了解static吗?_第3张图片

你真的了解static吗?_第4张图片

此时我们发现,每个对象中,了相同的属性班级

2.存在形式

被static修饰的成员变量或方法,是存在于方法区而并非栈区,它是随着类的创建而创建,随着类的销毁而消失。

在这段程序中,进入Student类中,classRoom已经在方法区加载完成了(如图一),而其余成员变量说在进入main方法区中的对象实例化中(也就是new Student)过程中申请内存创建的(如图二)
你真的了解static吗?_第5张图片
你真的了解static吗?_第6张图片

3.访问形式

可以通过对象名. 的形式来访问,合法但不合理,不会报错,但会警告
一般是通过类名. 的形式来访问

public class Student {
    public String name;
    public int age;
    public static String classRoom;

    public static void main(String[] args) {
        Student student = new Student();
        student.age = 18;
        student.name = "zhangsan";
        Student.classRoom = "101-3";//通过类名+.来访问

    }
}

注意

** 不能在静态方法中访问任何非静态成员变量**

如下图,因为在静态方法中无法传递this引用

你真的了解static吗?_第7张图片

4.static成员变量的初始化

4.1就地初始化

就地初始化就是在创建静态成员变量时就对其进行初始化。

  public static String classRoom = "101-3";

4.2使用代码块初始化

关于代码块的知识,在文章下半部分进行讲解

5.关于main

main方法是由static所修饰的,理论上来说,main方法也可以时非静态的,设计成被static修饰是因为在底层调用main时,不需要实例化对象,较为便利。

二.代码块

概念

使用 {} 定义的一段代码称为代码块

代码块分为普通代码块,静态代码块,构造代码块,同步代码块
同步代码块在后续文章会进行讲解

1.普通代码块

普通代码块时定义在方法中的代码块

public class test {
    public static void main(String[] args) {
    //普通代码块
        {
            int x = 10;
            System.out.println("x1="+x);
        }
        int x = 20;
        System.out.println("x2="+x);
    }
}

你真的了解static吗?_第8张图片

2.构造代码块

构造代码块也叫实例代码块
实例代码块:定义在类中的代码块,一般用于初始化类成员变量

public class Dog {
    public String name;
    public int age;
    public String color;
    //构造代码块
    {
        this.name = "xiaohuang";
        this.age = 18;
        this.color = "yellow";
    }
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.name);
        System.out.println(dog.age);
        System.out.println(dog.color);
    }
}

你真的了解static吗?_第9张图片

3.静态代码块

静态代码块:由static修饰的代码块

public class Dog {
    public String name;
    public int age;
    public String color;
    public static String master;
    //构造代码块
    {
        this.name = "xiaohuang";
        this.age = 18;
        this.color = "yellow";
    }
    //静态代码块
    static {
        master = "郭";
    }
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.name);
        System.out.println(dog.age);
        System.out.println(dog.color);
    }
}

注意事项

①加载形式

实例代码块只有在创建对象时才会执行
静态代码块也是随着类的创建而创建,随着类的销毁而消失。

②加载顺序

当三个代码块全都在代码中存在时,静态代码块最先被加载,其次是构造代码块,最后是普通代码块

码字不易,感谢观看
如果对你有帮助的话,记得点赞评论+关注吧

你可能感兴趣的:(Java,java,开发语言)