关键字static的用法

1.静态成员变量

创建一个person类,将类中成员变量i定义成静态成员变量,使用关键词static。

class person {
    static int i;
    int j; 
}

在另一个test类中调用静态成员变量可以直接由类名调用如1,也可以由对象调用如2。

class test{
    public static void main(String args []){
    person.i=10;                      ........1
    person p1=new person(); 
    p1.i=20;                             ........2
    person p2=new person();

    p2.j=30;
    person  p3=new person();
    p3.j=40
}
}

对于普通成员变量j,引用p2,p3分别指向一个对象,修改一个对象的成员变量不会对另一个对象的成员变量有影响,修改p2.j的值对p3.j的值没有影响,对于静态的成员变量i,无论生成多少个对象,所有的对象共用一个成员变量i,修改i的值,所有的对象共用的成员变量都会发生变化,即p1.i,p2.i,p3.i的值是一样的,修改其中的一个值,其它成员变量的值相应改变。

2.静态成员函数

class person{

static int i;
int j;

static void fun(){

    System.out.println("静态函数和静态变量"+i);
}

}

静态函数的定义使用关键词static,静态函数和静态变量都可以用类名来调用,无需生成对象。

静态函数中不能使用非静态的成员变量,在静态函数fun()中只能调用静态变量i,不能调用非静态变量j,使用类名直接调用静态函数时不生成对象,而调用非静态成员变量需要生成对象, 静态函数中不能使用this,因此静态函数中不能使用非静态成员变量。

3.静态代码块

static {

System.out.println("静态代码块");
}

静态代码块没有命名,定义方法直接用static加一个大括号,静态代码块在装载类的时候执行,静态代码块的主要作用是为静态变量赋初始值。

<think>嗯,用户想了解编程中关键字static用法和含义。首先,我需要回忆不同编程语言中static的不同应用。因为static在多种语言中都有出现,但具体用法可能不同。比如在C、C++、Java、C#中,static的作用域和生命周期管理是关键。而像JavaScript这样的语言,static可能用于类的方法或属性。 首先,用户可能没有明确说明是哪种语言,所以需要覆盖主要的几种情况。比如在C语言中,static用于函数内部的变量时,会延长其生命周期,使其在函数调用之间保持值不变。同时,在文件作用域中,static可以限制变量或函数仅在当前文件内可见。这可能和C++中的静态成员函数和变量有关联,C++中类的静态成员属于类本身,而不是实例。 然后,Java中的static用法和C++类似,用于类的成员,表示该成员属于类级别,所有实例共享。静态方法不能访问非静态成员,这点需要强调。此外,在Java中静态导入也是一个点,但可能用户更关注基础用法。 C#中的staticJava类似,但还有静态类,这种情况类只能包含静态成员,不能实例化。这部分可能需要提及。 JavaScript(ES6之后)的类中,static用于定义静态方法,这些方法只能通过类本身调用,而不是实例。比如Array.isArray这样的方法。 另外,用户可能对内存分配感兴趣,比如静态变量在内存中的位置,通常在程序的整个生命周期存在,存储在静态存储区。而局部静态变量虽然作用域受限,但生命周期是全局的。 还要考虑用户可能的常见误区,比如在C中函数内部static变量的初始化只进行一次,以及多线程环境下静态变量的线程安全问题。不过这可能超出基础用法的范围,但可以作为高级提示提及。 需要组织回答结构,分语言说明,并总结共同点。比如,static通常用于控制作用域、生命周期和共享性。同时,给出代码示例会更清晰,但用户提到行内数学表达式用$...$,但代码块应该用三个反引号。不过用户的问题是关于static的,可能不需要数学公式,但需要确保代码格式正确。 最后,生成相关问题,比如静态变量与全局变量的区别,静态方法的特点,不同语言中的差异,内存分配问题,设计模式中的应用等。这些问题可以帮助用户深入理解。 需要检查是否有遗漏的语言或用法,比如PHP中的static,或者在函数式编程中的使用,但可能用户主要关注主流面向对象语言。确保覆盖C、C++、Java、C#、JavaScript,并指出不同语言的可能差异。 总结:分点回答,按语言分类,说明每种情况下的用法,并给出示例代码。最后总结共同目的,并生成相关问题。</think>### 编程关键字 `static` 的用法与含义 `static` 是编程中常见的**关键字**,其具体含义和用法因语言而异,但核心思想通常围绕**作用域**、**生命周期**和**共享性**展开。以下是主要编程语言中的用法详解: --- #### 1. **C/C++ 中的 `static`** - **局部变量**(函数内部) 声明为 `static` 的局部变量会**保留值**,即使超出作用域也不会销毁,下次调用函数时仍可访问其值。生命周期与程序运行周期一致。 ```c void counter() { static int count = 0; // 只初始化一次 count++; printf("%d", count); } // 多次调用 counter() 输出:1, 2, 3... ``` - **全局变量/函数**(文件作用域) 使用 `static` 修饰全局变量或函数时,其作用域限制在**当前文件**内,避免与其他文件的同名符号冲突[^1]。 ```c static int internal_var = 42; // 仅本文件可见 ``` - **类成员(C++)** 静态成员属于**类本身**而非实例,所有对象共享同一份数据。静态方法只能访问静态成员。 ```cpp class MyClass { public: static int shared_value; // 类成员声明 static void printValue() { cout << shared_value; } }; int MyClass::shared_value = 0; // 类外定义 ``` --- #### 2. **Java/C# 中的 `static`** - **类成员** 静态变量或方法属于类级别,可直接通过类名调用,无需实例化。常用于工具类或共享数据。 ```java public class MathUtils { public static final double PI = 3.14159; // 常量 public static int add(int a, int b) { return a + b; } } // 调用:MathUtils.add(2, 3); ``` - **静态块(Java)** 用于初始化静态变量,在类加载时执行一次。 ```java static { System.loadLibrary("mylib"); } ``` - **静态类(C#)** 静态类不可实例化,仅包含静态成员。 ```csharp public static class Logger { public static void Log(string message) { ... } } ``` --- #### 3. **JavaScript 中的 `static`**(ES6+) - **类方法/属性** 静态方法通过类直接调用,不能访问实例成员。 ```javascript class ArrayUtils { static isEmpty(arr) { return arr.length === 0; } } // 调用:ArrayUtils.isEmpty([1,2]); ``` --- #### 4. **其他语言的 `static`** - **PHP**:在类方法中声明静态属性,或通过 `self::` 访问静态成员。 - **Python**:通过类变量实现类似功能,无显式 `static` 关键字,但可用装饰器 `@staticmethod` 定义静态方法。 --- ### 核心目的总结 1. **控制作用域**:限制变量/函数的可见范围(如 C 文件级静态变量)。 2. **管理生命周期**:延长局部变量的存储周期(如函数内静态变量)。 3. **共享性**:提供类级别的共享数据或方法(如 Java 静态变量)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值