new 修饰符是起什么作用

本文介绍了C#中的new修饰符与new操作符的区别,重点解释了new修饰符如何用于隐藏基类中的成员变量,并通过示例展示了其实现方式。

new 修饰符与 new 操作符是两个概念

new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。而new 操作符用于实例化一个类型

new 修饰符只能用于继承类,一般用于弥补基类设计的不足

new 修饰符和 override 修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example09
{
    class BaseClass
    {
        //基类设计者声明了一个PI的公共变量,方便进行运算
        public static double PI = 3.1415;
    }
    class DervieClass : BaseClass
    {
        //继承类发现该变量的值不能满足运算精度,于是可以通过new修饰符显式隐藏基类中的声明
        public new static double PI = 3.1415926;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(BaseClass.PI);
            Console.WriteLine(DervieClass.PI);
 
            Console.ReadLine();
        }
    }
}

结果:
3.1415
3.1415926

 
<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); // ❌ 编译错误!静态方法不能访问非静态变量 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值