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



静态的只会执行一次


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


相关文章
|
18天前
|
存储 Java
Java 中的静态(static)
【10月更文挑战第15天】静态是 Java 语言中一个非常重要的特性,它为我们提供了一种方便、高效的方式来管理和共享资源。然而,在使用过程中,我们需要谨慎考虑其优缺点,以确保代码的质量和可维护性。
|
30天前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
28 3
|
1月前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
21 5
|
1月前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
23 3
|
1月前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
178 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
|
2月前
|
存储 Java
Java之静态(static)与实例(instance)
Java之静态(static)与实例(instance)
|
3月前
|
Java 调度 开发者
Java 神秘新成员 —— 虚拟线程究竟是什么?它又能解开哪些编程痛点之谜?
【8月更文挑战第23天】Java虚拟线程是一种轻量级执行线程,由Java运行时管理,相较于传统操作系统线程,其创建和管理成本更低。基于用户模式线程概念,Java应用程序无需依赖OS即可实现高度并发。虚拟线程数量可远超传统线程,有效提升多核处理器利用率和并发性能。它解决了传统Java线程模型中创建成本高、调度开销大及I/O阻塞等问题,极大提高了程序的并发性和响应速度。
34 1
|
3月前
|
Java 程序员 API
从代码中寻找平衡:’java代码块和具体的代码应用
Java 8 引入的 Lambda 表达式是一项革命性特性,使编写简洁、灵活且易维护的代码成为可能。Lambda 表达式作为一种匿名函数,支持任意数量参数和返回值,其基本语法为 `(parameters) -> expression` 或 `(parameters) -> { statements; }`。
36 0
|
3月前
|
存储 Java 对象存储
【Java基础面试四十三】、 static和final有什么区别?
由于网络原因,我无法获取到您提供的链接内容。如果需要我解析该网页,请确保链接有效并重试,或者提供其他问题,我会尽力帮助您。