static的作用是什么

一、static可以说它是修饰变量的,static表示“全局”或者“静态”,但是Java中没有全局变量的概念。也可以用来修饰成员变量和成员方法,也可以形成static静态代码块。

被static修饰的成员变量和成员方法独立于该类的任何对象。也就是被static修饰的变量和方法不依赖类特定的实例,被类中的实例共享。

static可以在任何对象创建之前访问,无需引用任何对象。用public修饰的static成员和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。

static修饰的成员变量为静态成员变量,被static修饰的成员方法也称为静态成员方法。他们可以直接通过类名访问,其语法是

类名.静态方法名();
类名.静态变量名;

1、static变量

    按照静态对类成员进行分类可分为两种:一种是被static修饰的变量,成为静态变量或者类变量。第二种是没有被static修饰的称为实例变量。他们两者的区别是:对于静态变量在内存中只有一个拷贝可节省内存,JVM只为静态变量分配一次内存,在加载类的过程中完成对静态变量的内存分配。实例变量是每创建一个实例对象就会为它分配一次内存。实例变量可以在内存中有多个拷贝,互不影响所以使用起来灵活。

二、在Java中形成static静态代码块和静态方法有什么区别

    有时候需要程序一启动就执行这时候就需要用到静态代码块,这种代码是主动执行的。在项目启动的时候就需要初始化,在不创建对象的情况下用就用其他程序来调用的时候就要用到经静态方法。

静态方法与静态代码块的区别就是:
    1、静态方法是被调用的时候执行。

    2、静态代码块是自动执行的。

静态代码块与非静态代码块的区别:

    相同点:静态代码块和非静态代码块都是jvm加载类时且构造方法之前执行的,在类中都可以定义多个,一般在代码块中对一些static变量赋值。

    不同点:静态代码块在非静态代码块之前执行,静态代码块在只在第一次new时执行一次,而非静态代码块在每次new一次就执行一次。普通代码块可以在普通方法中定义,而静态代码块不可以。

在继承中执行顺序是:父类静态内容》子类静态内容》父类非静态代码块》父类构造方法》子类非静态代码块》子类构造方法

三、static静态内部类

    在写测试代码的时候必须要写一个主方法,它是程序的入口。但是如果有多个测试类,每个类都要写一个主方法这样就会多出很多额外代码,这时候我们就可以将静态的主方法写入到静态内部类中,这样可以节省很多。其实静态内部类在实际中很少用到,有时候需要在内部类中定义静态的成员方法或是成员变量就不行,在非静态的内部类中不能定义静态的成员方法和静态的成员变量。还有非静态内部类可以随意访问外部类的成员变量或是成员方法,但是静态内部类只能访问外部类中的静态成员。在类中创建成员内部类的时候,有个强制性的规定,即内部类实例一定要绑定在外部类实例上,也就是在创建内部类之前要用new关键词创建内部类对象。但是静态内部类就不需要,在创建静态内部类对象时不需要外部类对象。

四、静态导包
    静态导包时static特别的用法,静态导包就是讲Java包静态导入,所谓静态导包就是在import后面加上static

package demo_static;
import static java.lang.System.out;

public class Demo1 {

	public static void main(String[] args){
		out.println("123");
	}

}


<think>我们正在讨论Java(或类似语言)中的static修饰符。根据引用[1]和引用[2]的内容,static关键字主要有以下作用: 1. **静态变量(类变量)**: - 当类的所有实例共享同一个变量时,使用static修饰静态变量属于类,而不是类的任何一个实例。因此,无论创建多少个对象,静态变量在内存中只有一个副本。 - 例如,在引用[2]中,`count`是一个静态变量,它在类加载时被初始化,并且被所有实例共享。 2. **静态代码块**: - 使用static修饰代码块称为静态代码块。它在类被加载到内存时执行,且只执行一次。通常用于初始化静态变量。 - 在引用[2]中,静态代码块在类加载时执行,对`count`进行自增操作,并输出结果。 3. **静态方法**: - 静态方法属于类,而不属于任何对象。因此,静态方法可以直接通过类名调用,而不需要创建类的实例。 - 静态方法中不能直接访问非静态成员(变量方法),因为非静态成员需要对象实例才能存在。 4. **静态内部类**: - static也可以修饰内部类,使其成为静态内部类静态内部类不依赖于外部类的实例,可以直接创建。 5. **静态入**: - 使用`import static`可以入类的静态成员(变量方法),使得在代码中可以直接使用静态成员而不需要类名。 根据引用[1]的说明,使用static的场景: - 当对象中某个成员变量的值对所有对象都相同时,可以将其定义为静态变量。这样,这个变量只需要存储一份,所有对象共享。 - 如果数据是对象特有的(每个对象可能不同),那么应该定义为非静态变量。 在引用[2]的示例中,静态代码块在类加载时执行,并且只执行一次,因此即使创建多个`StaticDemo`对象,静态代码块也不会再次执行。 总结static作用: - 静态变量:所有对象共享,节省内存,可以通过类名直接访问。 - 静态方法:可以通过类名直接调用,常用于工具类。 - 静态代码块:在类加载时执行一次,用于初始化静态变量。 - 静态内部类:不依赖外部类实例,可以直接创建。 - 静态入:简化静态成员的调用。 现在,我们按照要求生成回答,并添加相关问题。</think>### `static` 修饰符的作用详解 `static` 是面向对象编程中的核心修饰符,用于定义**类级别**的成员(而非对象级别)。其核心作用如下: --- #### 一、静态变量(类变量) **作用**: - 被所有对象**共享**,内存中仅存一份副本(引用[1]) - 初始化时机:类加载时初始化(默认值如 `int` 为 0) - 访问方式:`类名.变量名`(无需实例化对象) **使用场景**: - 对象间需要共享数据(如计数器、全局配置) - 常量定义(通常配合 `final`) ```java class Player { static int totalPlayers = 0; // 所有玩家共享的计数器 public Player() { totalPlayers++; // 每创建新玩家,计数器+1 } } // 调用:Player.totalPlayers ``` --- #### 二、静态方法 **作用**: - 属于类而非对象,可直接通过类名调用 - **限制**:不能直接访问非静态成员(需通过对象实例) **使用场景**: - 工具类方法(如 `Math.sqrt()`) - 工厂方法(创建对象实例) ```java class StringUtils { static boolean isEmpty(String s) { return s == null || s.trim().isEmpty(); } } // 调用:StringUtils.isEmpty("text"); ``` --- #### 三、静态代码块 **作用**: - 类加载时**自动执行且仅执行一次**(引用[2]) - 初始化顺序:静态变量静态代码块 **使用场景**: - 初始化静态资源(如加载配置文件) ```java class Database { static String config; static { config = loadConfig(); // 类加载时初始化配置 System.out.println("配置已加载"); } } ``` --- #### 四、静态内部类 **作用**: - 不依赖外部类实例,可直接创建 - 可访问外部类的静态成员 **使用场景**: - 封装仅需静态访问的辅助类 ```java class Outer { static class Inner { void print() { System.out.println("静态内部类"); } } } // 调用:new Outer.Inner().print(); ``` --- ### 使用原则总结 | 场景 | 是否用 `static` | 原因说明 | |-------------------------------|-----------------|------------------------------| | 数据需被所有对象共享 | ✅ | 避免重复存储(引用[1]) | | 方法无需访问对象状态 | ✅ | 工具类方法 | | 类加载时需初始化资源 | ✅ | 静态代码块(引用[2]) | | 数据为对象特有(各实例不同) | ❌ | 必须用非静态变量 | > **关键区别**: > - 静态成员属于**类**,在类加载时分配内存 > - 非静态成员属于**对象**,在对象实例化时分配内存[^1][^2] --- ### 典型错误示例 ```java class Test { int x = 10; static void print() { System.out.println(x); // ❌ 编译错误!静态方法不能访问非静态变量 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值