Java之static成员与代码块

简介: 本篇文章主要介绍JavaSE中一些不是很常见的知识点,但也会涉及,需要了解一下

1.static成员


1.1 static修饰成员变量


假设学生类中有姓名、分数、年龄、班级等属性,但这两个同学都在同一个班级里。

在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。


class Student {
    String name;
    double score;
    int age;
    static String classes="1";
    public Student(String name, double score, int age) {
        this.name = name;
        this.score = score;
        this.age = age;
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Student s1=new Student("小明",88.0,18);
        Student s2=new Student("小红",89.2,19);
    }
}

微信图片_20230110225419.png

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


【静态成员变量特性】


  1. 1.不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 2.既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 3.类变量存储在方法区当中
  4. 4.生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)


1.2 static修饰成员方法

class Student {
    //......
    public static void staticFunc() {
        System.out.println("这是一个静态方法!");
    }
}
public class Demo1 {
    public static void main(String[] args) {
      Student.staticFunc();
    }
}
//这是一个静态方法!


【静态方法特性】

1.不属于某个具体的对象,是类方法

2.可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者

3.不能直接在静态方法中访问任何非静态成员(可以通过实例化对象或者传参的方式获取非静态成员属性)


1.3 static成员变量初始化


注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性


静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。


  1. 1.就地初始化
  2. 就地初始化指的是:在定义时直接给出初始值
class Student {
    String name;
    double score;
    int age;
    static String classes="1";
    //.....
}


  1. 2.静态代码块初始化
  2. 那什么是代码块呢?继续往后看


2. 代码块


2.1 代码块概念及分类


使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:


  • 本地代码块
  • 实例代码块
  • 静态代码块
  • 同步代码块(后续讲解多线程部分再谈)


2.2 代码块示例

class Student {
    String name;
    double score;
    int age;
    static String classes="1";
    public Student(String name, double score, int age) {
        this.name = name;
        this.score = score;
        this.age = age;
        System.out.println("构造方法!");
    }
    static {
        classes="2";
        System.out.println("静态代码块!");
    }
    {
        this.age=20;
        System.out.println("实例代码块!");
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Student s1=new Student("小明",91.2,19);
        System.out.println("===================");
        Student s2=new Student("小王",90,19);
        {
            System.out.println("本地代码块!");
        }
    }
}
//
静态代码块!
实例代码块!
构造方法!
===================
实例代码块!
构造方法!
本地代码块!


本地代码块:定义在方法中的代码块(比较少用)

实例代码块:定义在类中的代码块(不加修饰符)。一般用于初始化实例成员变量。

静态代码块:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。


注意事项:


  • 先执行静态的【加载了类就会被执行】
  • 如果有多个静态的,看定义顺序,按顺序执行
  • 如果没有实例化对象,那么只会执行静态的
class Student {
    String name;
    double score;
    int age;
    static String classes="1";
    public Student(String name, double score, int age) {
        this.name = name;
        this.score = score;
        this.age = age;
        System.out.println("构造方法!");
    }
    static {
        classes="2";
        System.out.println("静态代码块!");
    }
    {
        this.age=20;
        System.out.println("实例代码块!");
    }
}
public class Demo1 {
    public static void main(String[] args) {
        System.out.println(Student.classes);
    }
}
//
静态代码块!
2



静态的只会执行一次


  • 再执行实例的数据【有多个实例的话要看定义的顺序】
  • 最后执行构造函数


相关文章
java构造方法,构造代码块,静态代码块的执行顺序
本文介绍了Java中构造方法、构造代码块和静态代码块的执行顺序。静态代码块用`static`声明,在JVM加载类时执行一次;构造代码块在每次创建对象时执行,先于构造方法;构造方法用于对象初始化,创建对象时调用。示例代码展示了这三者的输出顺序,并解释了它们的区别和应用场景。
443 1
|
缓存 运维 Java
Java静态代码块深度剖析:机制、特性与最佳实践
在Java中,静态代码块(或称静态初始化块)是指类中定义的一个或多个`static { ... }`结构。其主要功能在于初始化类级别的数据,例如静态变量的初始化或执行仅需运行一次的初始化逻辑。
525 4
|
存储 安全 Java
探索 Java 静态变量(static)的奥秘
本文深入探讨了Java中的静态变量(`static`),从初印象、使用场景、访问方式、初始化、线程安全、优缺点到最佳实践,全面解析其特性和应用场景。静态变量属于类而非实例,适用于共享数据、定义全局常量和工具类中的变量。它在类加载时初始化,生命周期贯穿整个程序运行。然而,多线程环境下需注意线程安全问题,可通过`synchronized`或原子类解决。优点包括共享数据方便和提高性能,但也存在线程安全和代码耦合度增高的缺点。最佳实践建议谨慎使用、保证线程安全、遵循命名规范并封装访问。掌握静态变量的正确用法,能让你的代码更加高效简洁。
1118 11
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
280 3
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
550 8
|
存储 Java
Java 中的静态(static)
【10月更文挑战第15天】静态是 Java 语言中一个非常重要的特性,它为我们提供了一种方便、高效的方式来管理和共享资源。然而,在使用过程中,我们需要谨慎考虑其优缺点,以确保代码的质量和可维护性。
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
393 3
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
328 5
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
474 3
|
Java 程序员 Go
Java基础6:代码块与代码加载顺序
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/80069472 这位大侠,这是我的公众号:程序员江湖。