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



静态的只会执行一次


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


相关文章
|
24天前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
25 3
|
1月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
51 8
|
1月前
|
存储 Java
Java 中的静态(static)
【10月更文挑战第15天】静态是 Java 语言中一个非常重要的特性,它为我们提供了一种方便、高效的方式来管理和共享资源。然而,在使用过程中,我们需要谨慎考虑其优缺点,以确保代码的质量和可维护性。
|
2月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
38 3
|
2月前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
28 5
|
2月前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
142 3
|
2月前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
254 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
|
3月前
|
存储 Java
Java之静态(static)与实例(instance)
Java之静态(static)与实例(instance)
|
Java 数据安全/隐私保护
|
9天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
38 6