当前位置: 首页 > article >正文

高级java每日一道面试题-2024年11月14日-基本篇-static都有哪些用法?

如果有遗漏,评论区告诉我进行补充

面试官: static都有哪些用法?

我回答:

在Java中,static关键字有多种用法,它影响着变量的生命周期、方法的调用方式以及类的初始化行为。以下是对static关键字的详细解释和用法:

1. 静态变量(类变量)

静态变量是属于类的变量,而不是属于某个特定对象的实例变量。它们被类的所有实例共享。静态变量在类加载时初始化,而不是在创建对象时。

优点

  • 节省内存:静态变量只有一份副本,所有对象共享同一份内存。
  • 全局访问:可以通过类名直接访问静态变量,无需创建对象。

示例

public class MyClass {
    static int staticVar = 10;
    int instanceVar = 20;

    public static void main(String[] args) {
        System.out.println(MyClass.staticVar); // 访问静态变量
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();
        obj1.staticVar = 30; // 改变静态变量的值
        System.out.println(obj2.staticVar); // 输出30,因为静态变量是共享的
    }
}

2. 静态方法

静态方法是属于类的方法,可以在不创建对象的情况下调用。静态方法不能直接访问实例变量或实例方法,因为它们属于类的特定实例。但是,它们可以访问静态变量和其他静态方法。

优点

  • 全局访问:可以通过类名直接调用静态方法,无需创建对象。
  • 节省内存:静态方法只有一份副本,所有对象共享同一份内存。

示例

public class MyClass {
    static int staticVar = 10;
    int instanceVar = 20;

    public static void staticMethod() {
        System.out.println("This is a static method.");
        System.out.println("Static variable: " + staticVar); // 可以访问静态变量
        // System.out.println("Instance variable: " + instanceVar); // 错误:不能访问实例变量
    }

    public void instanceMethod() {
        System.out.println("This is an instance method.");
    }

    public static void main(String[] args) {
        MyClass.staticMethod(); // 调用静态方法
        // MyClass.instanceMethod(); // 错误:不能这样调用实例方法

        MyClass obj = new MyClass();
        obj.instanceMethod(); // 正确:通过对象调用实例方法
    }
}

3. 静态代码块

静态代码块在类加载时执行,并且只执行一次。它们通常用于静态变量的复杂初始化。

优点

  • 初始化:静态块用于初始化静态变量,确保在类加载时完成必要的初始化工作。
  • 只执行一次:静态块在类加载时执行,且只执行一次,适合用于一次性初始化操作。

示例

public class MyClass {
    static int staticVar;

    static {
        staticVar = 10; // 静态代码块中的初始化
        System.out.println("Static block executed.");
    }

    public static void main(String[] args) {
        System.out.println("Static variable: " + staticVar);
    }
}

4. 静态嵌套类(静态内部类)

静态嵌套类(也称为静态内部类)是一个被声明为静态的嵌套类。静态嵌套类可以访问外部类的静态成员,但不能直接访问外部类的实例成员。

示例

public class OuterClass {
    static int outerStaticVar = 10;
    int outerInstanceVar = 20;

    static class StaticNestedClass {
        void display() {
            System.out.println("Outer static variable: " + outerStaticVar); // 可以访问
            // System.out.println("Outer instance variable: " + outerInstanceVar); // 错误:不能访问
        }
    }

    public static void main(String[] args) {
        OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass();
        nestedObj.display();
    }
}

优点

  • 封装:静态内部类可以封装在外部类中,提高代码的组织性和可维护性。
  • 独立性:静态内部类可以独立于外部类的实例存在,不需要创建外部类的对象即可使用。

5. 静态导入

静态导入允许你导入一个类或接口的静态成员,这样在代码中就可以直接使用这些静态成员,而不需要使用它们的类名作为前缀。

示例

import static java.lang.Math.PI; // 静态导入Math类的PI常量

public class MyClass {
    public static void main(String[] args) {
        System.out.println("Value of PI: " + PI); // 直接使用PI,而不是Math.PI
    }
}

总结

  • 静态变量:属于类,所有实例共享,类加载时初始化。
  • 静态方法:属于类,不能访问实例变量或实例方法,可以通过类名直接调用。
  • 静态代码块:在类加载时执行,用于静态变量的复杂初始化。
  • 静态嵌套类:可以访问外部类的静态成员,但不能直接访问外部类的实例成员。
  • 静态导入:导入静态成员,允许直接使用而不需要类名前缀。

理解这些用法对于深入掌握Java类结构和内存管理非常重要,特别是在多线程和高级框架应用中。


http://www.kler.cn/a/401122.html

相关文章:

  • Chrome 浏览器 131 版本新特性
  • 使用Faiss构建音频特征索引并计算余弦相似度
  • 3D Streaming 在线互动展示系统:NVIDIA RTX 4090 加速实时渲染行业数字化转型
  • Object.defineProperty和响应式
  • 通用定时器---输出比较功能
  • 基于Python实现的HDR图像处理算法
  • Linux之vim全选,全部复制,全部删除
  • 【H2O2|全栈】JS进阶知识(五)ES6(1)
  • 记录下,用油猴Tampermonkey监听所有请求,绕过seesion
  • Jmeter进阶篇(26)杀掉Tomcat的几种方法
  • 国产三维CAD 2025新动向:推进MBD模式,联通企业设计-制造数据
  • 【数据结构】七种常用排序总结
  • 阿里云ElasticSearch跨集群备份恢复实践
  • Cloud Native 云原生后端的开发注意事项
  • Vue3.5正式上线,父传子props用法更丝滑简洁
  • Redis 性能优化 18招
  • 每日学习记录003:(C++)unique_ptr和shared_ptr
  • ftrack 24.10全面升级:Autodesk Flame集成与多项新功能性能改进将发布
  • spring boot启动停止重启脚本
  • 视觉SLAM--经典视觉SLAM框架
  • MySQL数据库-SQLyoung的使用
  • 【金融风控项目-07】:业务规则挖掘案例
  • 播放器开发之ffmpeg 硬件解码方案
  • 【一文了解】C#基础-数组
  • leetcode 面试150 之随机链表的复制
  • Oracle 19c修改pga报ORA-00093、ORA-01078错进行分析处理