Java static关键字

Java static关键字

java static关键字主要是方便在没有创建对象的情况下进行调用,这里面包括变量和方法。也就是说,只要类被加载了,就可以通过类名进行访问,static关键字可以修饰类的成员变量以及成员方法。注意,被static修饰的变量和方法通常放在内存的静态区里。

1. 静态变量

如果在声明变量时使用了static关键字,那么这个变量就称之为静态变量。静态变量只是在类加载的时候获取一次内存空间,这使得静态变量很节省空间。例如:

class StaticClass{
    static int value=255;
}

class Demo{
    public static void main(String[] args){
        StaticClass.calue
    }
}

2. 静态方法

静态方法具有以下特点:

  1. 静态方法属于这个类而不是这个类的对象;
  2. 调用静态方法时不需要创建这个类的对象;
  3. 静态方法可以访问静态变量。

例如:

class Student{
    String name;
    int age;
    static String address;
    public sttaic void sayHello(){
        
    }
}

到时其它类如果想访问静态变量和静态方法时只需要:

Student.address
Student.sayHello()

需要注意的是,静态方法不能访问非静态变量和非静态方法,例如,如下操作是错误的:

Student.name;	//error
Student.sayHello();	//error

main主方法是静态的,如果main方法不设置为静态方法,则Java虚拟机在执行的时候还要创建一个对象才能调用main方法,而main方法作为程序的入口,没有必要专门创建一个对象来调用main方法。

3. 静态代码块

用一个static关键字和一对大括号括起来的代码称之为静态代码块。例如:

public class Demo{
    static {
        System.out.println("静态代码块执行...");
    }
    
    public static void main(String[] args) {
        System.out.println("main...");
    }
}

程序运行结果是:

静态代码块执行...
main...

也就是说,静待代码块优先于main方法先执行!

但是如果没有main方法是否可以直接执行静态代码块?例如:

public class Demo {

    static {
        System.out.println("静态代码块执行...");
    }

//    public static void main(String[] args) {
//        System.out.println("主方法执行");
//    }
}

执行如下命令:

javac Demo.java
java Demo
//...

则会抛出NoClassDefFoundError错误。

需要注意的是,静态代码块通常用于加载配置文件到内存中。

4. 静态内部类

Java允许开发人员在一个类中声明一个内部类,常见的内部类有四种:

  • 成员内部类
  • 局部内部类
  • 匿名内部类
  • 静态内部类

这里只说明静态内部类。例如:

public class Demo{
    
    public Demo(){
        
    }
    
    public static class StaticClass{
        public static Demo demoInstance = new Demo();
    }
    
    public static Demo getDemoInstance(){
        return StaticClass.demoInstance;
    }
}

在这里第一次加载Demo类的时候,并不会并不会初始化demoInstance,只有在第一次调用getDemoInstance()方法的时候Java虚拟机才会加载StaticClass这个类并初始化demoInstance,这样不仅可以保证线程安全性,也可以保证Demo类的唯一性。

需要注意的是:

  1. 静态内部类不能访问外部类的所有成员变量;
  2. 静态内部类可以访问外部类所有的静态变量,这里也包括私有静态变量;
  3. 外部类不允许被声明为static。
posted @   LilyFlower  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示