在学习java开发的时候,对书上解释的static关键字不是很熟悉,所以写下学习记录。
摘抄文章:https://www.yiibai.com/java/static-keyword-in-java.html

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

静态(static)可以是:

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

    1. Java静态变量

    如果将一个变量声明为static,它就是所谓的静态变量了。

  • 静态变量可以用于引用所有对象的公共属性(对于每个对象不是唯一的)。如:员工公司名称,学生所在的大学名称。

    静态变量的优点:

  • 它能使程序存储器高效(即它节省内存)。

理解不使用静态变量的问题

  1. class Student{
  2. int rollno;
  3. String name;
  4. String college="ITS";
  5. }

假设在一所学校有500名学生,现在所有实例数据成员将在每次创建对象时获取内存。所有学生都有其唯一的注册ID:rollno和 name ,因此实例数据成员没有什么问题。college 指的是所有对象的共同属性。如果使它静态化(使用static关键字修饲),这个字段将只获得内存一次。

Java静态属性被共享给所有对象。

静态变量的示例

  1. //Program of static variable
  2. class Student8 {
  3. int rollno;
  4. String name;
  5. static String college = "ITS";
  6. Student8(int r, String n) {
  7. rollno = r;
  8. name = n;
  9. }
  10. void display() {
  11. System.out.println(rollno + " " + name + " " + college);
  12. }
  13. public static void main(String args[]) {
  14. Student8 s1 = new Student8(111, "Karan");
  15. Student8 s2 = new Student8(222, "Aryan");
  16. s1.display();
  17. s2.display();
  18. }
  19. }

运行结果如下

  1. 111 Karan ITS
  2. 222 Aryan ITS

创建对象示例图如下所示
Java static关键字 - 图1

不使用静态变量的计数器程序

在这个例子中,我们创建了一个名为count的实例变量用来统计创建对象的数目,它在构造函数中执行递增。 由于实例变量在创建对象时要获取内存,每个对象都将具有实例变量的副本,如果它被递增了,它也不会反映到其他对象中。所以每个对象在count变量中的值还是1。

  1. class Counter {
  2. int count = 0;// will get memory when instance is created
  3. Counter() {
  4. count++;
  5. System.out.println(count);
  6. }
  7. public static void main(String args[]) {
  8. Counter c1 = new Counter();
  9. Counter c2 = new Counter();
  10. Counter c3 = new Counter();
  11. }
  12. }

运行结果如下

  1. 1
  2. 1
  3. 1

计数器静态变量的程序
如上所述,静态变量将只获取一次内存,如果任何对象更改静态变量的值,它将保留其值,所有实例均可访问同一变量值。

  1. class Counter2 {
  2. static int count = 0;// will get memory only once and retain its value
  3. Counter2() {
  4. count++;
  5. System.out.println(count);
  6. }
  7. public static void main(String args[]) {
  8. Counter2 c1 = new Counter2();
  9. Counter2 c2 = new Counter2();
  10. Counter2 c3 = new Counter2();
  11. }
  12. }

上面代码执行结果如下

  1. 1
  2. 2
  3. 3

总结:static定义的变量可被所有实例访问,且省内存

2. Java静态方法

如果在任何方法上应用static关键字,此方法称为静态方法。

  • 静态方法属于类,而不属于类的对象。
  • 可以直接调用静态方法,而无需创建类的实例。
  • 静态方法可以访问静态数据成员,并可以更改静态数据成员的值。

    静态方法的示例

    1. class Student9 {
    2. int rollno;
    3. String name;
    4. static String college = "ITS";
    5. static void change() {
    6. college = "BBDIT";
    7. }
    8. Student9(int r, String n) {
    9. rollno = r;
    10. name = n;
    11. }
    12. void display() {
    13. System.out.println(rollno + " " + name + " " + college);
    14. }
    15. public static void main(String args[]) {
    16. Student9.change();
    17. Student9 s1 = new Student9(111, "Karan");
    18. Student9 s2 = new Student9(222, "Aryan");
    19. Student9 s3 = new Student9(333, "Sonoo");
    20. s1.display();
    21. s2.display();
    22. s3.display();
    23. }
    24. }

    运行结果如下

    1. 111 Karan BBDIT
    2. 222 Aryan BBDIT
    3. 333 Sonoo BBDIT

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

    1. class Calculate {
    2. static int cube(int x) {
    3. return x * x * x;
    4. }
    5. public static void main(String args[]) {
    6. int result = Calculate.cube(5);
    7. System.out.println(result);
    8. }
    9. }

    上面代码执行输出以下结果

    1. 125

    静态方法的限制
    静态方法有两个主要限制。它们分别是:

  • 静态方法不能直接使用非静态数据成员或调用非静态方法。

  • this和super两个关键字不能在静态上下文中使用。

如下示意程序中,变量a是非静态的,所以静态方法println不能直接使用a

  1. class A {
  2. int a = 40;// non static
  3. public static void main(String args[]) {
  4. System.out.println(a);
  5. }
  6. }

运行报错

  1. [编译错误!]Compile Time Error

为什么Java main方法是静态的

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

3. Java静态块

Java中的静态块主要有两个作用:

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

静态块的示例

  1. class A2 {
  2. static {
  3. System.out.println("static block is invoked");
  4. }
  5. public static void main(String args[]) {
  6. System.out.println("Hello main");
  7. }
  8. }

运行结果

  1. static block is invoked
  2. Hello main

可以看见static的输出在main方法之前。

可以执行程序没有main()方法吗?

答:是的,一种方式是静态块,但在以前旧的JDK版本中,不是在JDK 1.7。

  1. class A3 {
  2. static {
  3. System.out.println("static block is invoked");
  4. System.exit(0);
  5. }
  6. }

在JDK7及以上版本中,输出将为:

  1. 错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为:
  2. public static void main(String[] args)