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

Java中的static都能用来修饰什么?

在Java编程语言中,static关键字是非常重要的修饰符,可以用于多种不同的地方。可用来修饰变量、方法、代码块以及类。


1.静态变量


定义:静态变量属于类本身,而不是类的任何特定实例(new出来的对象)。
特点:
1.所有实例共享同一静态变量。
2.在类加载到内存时就被初始化,而不是在创建对象的时候。
3.常用于管理类的全局状态或作为常量仓库(例如public static final修饰的常量)。

2 静态方法:


定义:静态方法同样属于类,而非类的实例。
特点:
1.可以在不创建类的实例的情况下调用。
2.不能访问类的实例变量或实例方法,它们只能访问其他的静态成员。
3.常用于工具类的方法,例如Math.sqrt()或Collections.sort()。

3 静态代码块:


定义:用于初始化类的静态变量。
特点:
1.当类被Java虚拟机加载并初始化时执行。
2.通常用于执行静态变量的复杂初始化。

4.静态内部类:


定义:在一个类的内部定义的静态类。
特点:
1.可以不依赖于外部类的实例而独立存在。
2.可以访问外部类的所有静态成员,但不能直接访问外部类的实例成员。
3.常用于当内部类的行为不应依赖于外部类的实例时。

这里有两段代码,看看有什么不同

public class OuterClass {
    //静态内部类
    public static class inClass{
        private int value;

        public inClass(int value) {
            this.value =value;
        }

        public void display() {
            System.out.println("Value" +value);
        }
    }


}
 class Test{

     public static void main(String[] args) {
         OuterClass.inClass t1 = new OuterClass.inClass(5);
         t1.display();
     }

}

public class OuterClass {
    //静态内部类
    public static class inClass{
        private int value;

        public inClass(int value) {
            this.value =value;
        }

        public void display() {
            System.out.println("Value" +value);
        }
    }

    public static void main(String[] args) {
        OuterClass.inClass t1 = new inClass(5);
        t1.display();
    }
}

思考

我在第二段代码创建t1对象的时候没有选择new OuterClass.inClass(5),我很好奇因为按照规范应该会报错,于是我去查了查。

其实背后是 Java 编译器“容忍性”的一个体现。

乍一看像是错误的,因为在 new inClass(5) 这里省略了前缀 OuterClass.,但编译器居然没有报错。

为什么没报错?

因为你写的是在 OuterClass 的代码内部,也就是说你在 main 方法中就处在 OuterClass 的作用域里。Java 编译器允许你在这个作用域中省略 OuterClass. 这个前缀。举个类似的例子:

public class A {
    public static class B {
        public void hello() {
            System.out.println("Hi");
        }
    }

    public static void main(String[] args) {
        B b = new B();  // 不写 A.B 也没问题
        b.hello();
    }
}

}
这个代码能正常运行,因为在 A 的作用域里,B 是可见的。

那如果你在类外部使用呢?
如果你尝试在另一个类中写:

public class Test {
    public static void main(String[] args) {
        inClass t = new inClass(5);  // 这就不行了!
    }
}

这时候就一定要写成:

OuterClass.inClass t = new OuterClass.inClass(5);

否则编译器就会报错:cannot find symbol

有没有突然觉得 Java 编译器其实还是挺“贴心”的 😄?

相关文章:

  • 【强化学习-蘑菇书-2】通过具体的例子来学习如何与 Gym 库进行交互——小车上山(MountainCar-v0)
  • idea开发工具多账号使用拉取代码报错问题
  • 探秘 HTML5 Geolocation:精准定位用户位置,拓展网页交互边界
  • Redis-数据类型
  • AF3 ProteinDataset类的get_anchor_ind方法解读
  • 基于生成对抗网络(GAN)的手写数字生成实践
  • 了解SpringAOP
  • 【React】React-toolkit
  • java设计模式-组合模式
  • 路由交换网络专题 | 第二章 | RIP | OSPF | 路由聚合 | 路由过滤 | 静默接口
  • Linux上位机开发实践(底板设计)
  • matlab与dsp28335联调
  • MySQL索引介绍
  • 什么是VLA
  • 【数据结构】HashMap源码 —— 简单介绍
  • 人工智能之数学基础:奇异值分解SVD
  • JAVA SDK通过proxy对接google: GCS/FCM
  • 实测解析:FP7208 在汽车照明、摄影照明、教育照明以及太阳能照明等不同市场领域的典型应用参数解析和案例分析
  • Kingbase 常用运维命令总结
  • Vue的学习总结-day02
  • 铜仁 网站开发/关键词调词平台
  • 云南省建设厅网站首页/四川成都最新消息
  • 中秋网页设计素材网站/市场调研的四个步骤
  • 襄樊建设网站/网站推广网
  • 建房设计图软件app/招聘seo专员
  • 天津网站设计 河西/百度统计app下载