在 Java 中,static 关键字主要用于内存管理。我们可以将 static 关键字应用于变量、方法、块和嵌套类。static 关键字属于类而不是类的实例。

static 可以应用于以下内容:

  1. 变量(也称为类变量)
  2. 方法(也称为类方法)
  3. 静态代码块
  4. 嵌套类

1)Java静态变量

如果您将任何变量声明为静态,则它被称为静态变量。

  • 静态变量用于引用所有对象的公共属性,例如公司名称、大学名称等。它们不是每个对象唯一的,而是属于整个类。
  • 静态变量在类加载时只分配一次内存空间,即使创建多个类的实例,这些实例共享相同的静态变量。

静态变量的优点

静态变量使得程序的内存使用更加高效,节省内存空间。由于静态变量属于类而不是实例,它们不会在每个对象中重复存储相同的值,而是在整个类中共享相同的值。这样可以节省大量的内存空间。

理解没有静态变量的问题

class Student{  
     int rollno;  
     String name;  
     String college="ITS";  
}  

假设您的大学有 500 个学生,现在每次创建对象时,所有实例数据成员都会占用内存。每个学生都有其独特的学号(rollno)和姓名(name),因此在这种情况下,实例数据成员是适合的。

然而,“学院”是所有对象共有的属性。如果将它定义为静态变量,这个字段只会在内存中分配一次。

Java 静态属性是所有对象共享的。

静态变量示例

//Java程序演示静态变量的使用 
class Student{  
   int rollno;//实例变量 
   String name;  
   static String college ="ITS";//静态变量
   //构造函数 
   Student(int r, String n){  
   rollno = r;  
   name = n;  
   }  
   //显示值的方法 
   void display (){System.out.println(rollno+" "+name+" "+college);}  
}  
//测试类显示对象的值
public class TestStaticVariable1{  
 public static void main(String args[]){  
 Student s1 = new Student(111,"小卡");  
 Student s2 = new Student(222,"小安");  
//我们可以通过一行代码改变所有对象的学院 
//Student.college="BBDIT"; 
 s1.display();  
 s2.display();  
 }  
}  

输出:

111 小卡 ITS
222 小安 ITS

无静态变量的计数器程序

在这个示例中,我们定义了一个名为count的实例变量,并在构造函数中对其进行递增操作。由于实例变量在对象创建时分配内存空间,因此每个对象都会有自己的count变量副本。当count增加时,它不会影响其他对象的count值。因此,每个对象在count变量中的值始终为1。这意味着每个对象都会保持其独立的计数值。

//Java程序演示实例变量的使用 
2//每次创建类的对象时都会获取内存。
class Counter{  
int count=0;//每次创建实例时都会获取内存 
  
Counter(){  
count++;//增值
System.out.println(count);  
}  
  
public static void main(String args[]){  
//创建对象 
Counter c1=new Counter();  
Counter c2=new Counter();  
Counter c3=new Counter();  
}  
}  

输出:

1
1
1

静态变量计数器程序

正如我们上面提到的,静态变量只会获得一次内存,如果任何对象改变了静态变量的值,它会保留它的值。

//Java程序中静态变量的使用说明 
//与所有对象共享。 
class Counter2{  
static int count=0; //只会获取一次内存并保留它的值  
  
Counter2(){  
count++;//增加静态变量的值 
System.out.println(count);  
}  
  
public static void main(String args[]){  
//创建对象
Counter2 c1=new Counter2();  
Counter2 c2=new Counter2();  
Counter2 c3=new Counter2();  
}  
}  

输出:

1
2
3

2)Java静态方法

  • 如果在任何方法上应用了 static 关键字,则该方法被称为静态方法。

静态方法属于类而不是类的实例。

无需创建类的实例即可调用静态方法。

静态方法可以访问静态数据成员,并且可以修改其值。这使得静态方法在操作类级别的数据时非常有用。

静态方法示例

//Java 程序演示静态方法的使用。 
class Student{  
     int rollno;  
     String name;  
     static String college = "ITS";  
     //静态方法改变静态变量的值 
     static void change(){  
     college = "BBDIT";  
     }  
     //构造函数来初始化变量
     Student(int r, String n){  
     rollno = r;  
     name = n;  
     }  
     //显示值的方法 
     void display(){System.out.println(rollno+" "+name+" "+college);}  
}  
//测试类创建和显示对象的值 
public class TestStaticMethod{  
    public static void main(String args[]){  
    Student.change();//调用变化方法 
    //创建对象 
    Student s1 = new Student(111,"小卡");  
    Student s2 = new Student(222,"小安");  
    Student s3 = new Student(333,"小宋");  
    //调用显示方法 
    s1.display();  
    s2.display();  
    s3.display();  
    }  
}  

输出:

111 小卡 BBDIT
222 小安 BBDIT
333 小宋 BBDIT

执行正常计算的静态方法的另一个示例

//Java程序使用静态方法获取给定数字的立方体 
  
class Calculate{  
  static int cube(int x){  
  return x*x*x;  
  }  
  
  public static void main(String args[]){  
  int result=Calculate.cube(5);  
  System.out.println(result);  
  }  
}  

输出:

125

静态方法的限制

静态方法有两个主要限制。他们是:

  1. 静态方法不能使用非静态数据成员或直接调用非静态方法。
  2. this 和 super 不能在静态上下文中使用。
class A{  
 int a=40;//非静态
   
 public static void main(String args[]){  
  System.out.println(a);  
 }  
}        

输出:

编译时错误

Q) 为什么 Java main 方法是静态的?

Ans) 这是因为对象不需要调用静态方法。如果是非静态方法,JVM会先创建一个对象,然后调用main()方法,会导致额外分配内存的问题。

3)Java静态块

  • 用于初始化静态数据成员。
  • 它在类加载时在 main 方法之前执行。

静态块示例

class A2{  
  static{System.out.println("静态块被调用");}  
  public static void main(String args[]){  
   System.out.println("Hello main");  
  }  
}  

输出:

静态块被调用
Hello main

Q) 我们可以在没有 main() 方法的情况下执行程序吗?

Ans) 不,其中一种方法是静态块,但直到 JDK 1.6 才有可能。从 JDK 1.7 开始,没有main 方法就无法执行 Java 类。

class A3{  
  static{  
  System.out.println("静态块被调用");  
  System.exit(0);  
  }  
}  

输出:

静态块被调用

从 JDK 1.7 及更高版本开始,输出将是:

Error: Main method not found in class A3, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想