【基础】static 关键字

矫情吗;* 2022-07-15 10:46 250阅读 0赞

static的作用

static的作用从三个方面来谈,分别是静态变量、静态方法、静态类。

1)静态变量

  1. 声明为static的静态变量实质上就是全局变量,当声明一个对象时,并不产生static变量的拷贝,

而是该类所有实例变量共用同一个static变量。也就是说这个静态变量只加载一次,只分配一块储存空间。

2)静态方法

声明为static的静态方法有以下几个特点:

.静态方法只能调用静态方法;

.静态方法只能访问静态数据;

.静态方法不能以任何方式引用this或super;

3)静态类

  1. 通常一个普通类不允许声明为静态,只有一个内部类才可以(main方法就是一个典型),

这时这个声明的静态类可以直接作为一个普通类来使用,而不需要实例一个外部类。

static在类加载时执行,同时只执行一次;

  1. package com.lanhuigu.java;
  2. public class StaticInitialization {
  3. public static void main(String[] args) {
  4. System.out.println("Creating new School() in main");
  5. new School();
  6. System.out.println("Creating new School() in main");
  7. teacher.f2(1);
  8. school.f3(1);
  9. }
  10. static Teacher teacher = new Teacher();
  11. static School school = new School();
  12. }
  13. class Student {
  14. Student(int marker) {
  15. System.out.println("Student(" + marker +")");
  16. }
  17. void f1(int marker) {
  18. System.out.println("f1("+ marker +")");
  19. }
  20. }
  21. class Teacher {
  22. static Student s1 = new Student(1);
  23. Teacher() {
  24. System.out.println("Teacher()");
  25. s2.f1(1);
  26. }
  27. void f2(int marker) {
  28. System.out.println("f2(" + marker + ")");
  29. }
  30. static Student s2 = new Student(2);
  31. }
  32. class School {
  33. Student s3 = new Student(3);
  34. static Student s4 = new Student(4);
  35. School() {
  36. System.out.println("School()");
  37. s4.f1(2);
  38. }
  39. void f3(int marker) {
  40. System.out.println("f3("+ marker +")");
  41. }
  42. static Student s5 = new Student(5);
  43. }

程序控制台运行结果:

Student(1)
Student(2)
Teacher()
f1(1)
Student(4)
Student(5)
Student(3)
School()
f1(2)
Creating new School() in main
Student(3)
School()
f1(2)
Creating new School() in main
f2(1)
f3(1)

结合程序分析static执行顺序和次数:

在运行程序时,控制台没有打印Creating new School() in main,说明并没有执行main中的

System.out.println(“Creating new School() in main”);

然而控制台中打印了Student(1),这个是从StaticInitialization类下的

static Teacher teacher = new Teacher();执行而来。

StaticInitialization类中先执行static Teacher teacher = new Teacher();静态代码按顺序先执行。

在Teacher类中代码如下:

class Teacher {

  1. static Student s1 = new Student(1);
  2. Teacher() \{
  3. System.out.println("Teacher()");
  4. s2.f1(1);
  5. \}
  6. void f2(int marker) \{
  7. System.out.println("f2(" + marker + ")");
  8. \}
  9. static Student s2 = new Student(2);

}

在Teacher类中,我们可以看到在类开始和结束位置都分别有两个静态代码,

按顺序先执行 static Student s1 = new Student(1);调用Student类中的构造方法:

Student(int marker) {

  1. System.out.println("Student(" + marker +")");

}

在控制台打印Student(1),然后执行Teacher类中的第二个静态代码 static Student s2 = new Student(2);

同样调用Student类中的构造器打印出Student(1),最后再执行Teacher类中的构造器:

Teacher() {

  1. System.out.println("Teacher()");
  2. s2.f1(1);
  3. \}

打印出Teacher(),然后通过s2调用Student类中的f1方法,打印出f1(1),这样我们的StaticInitialization

中第一个静态代码static Teacher teacher = new Teacher();执行完毕。

然后再按顺序执行StaticInitialization类中的第二个静态代码static School school = new School();

在School类中执行顺序如下:

按照先执行第一个静态代码static Student s4 = new Student(4);

第二个静态代码static Student s5 = new Student(5);

再执行Student s3 = new Student(3);

最后执行构造器:

School() {

  1. System.out.println("School()");
  2. s4.f1(2);

}

的顺序执行代码,打印出对应的内容。

在StaticInitialization类中执行完静态代码

static Teacher teacher = new Teacher();

static School school = new School();

然后再执行main方法:

System.out.println(“Creating new School() in main”);

new School();

……

对于main中的new School();在School类中执行时不会再执行其中的静态代码,

也就是说不会再执行static Student s1 = new Student(1);static Student s2 = new Student(2);

因为静态代码只执行一次,在开始的时候已经执行了,这个地方再School类中不会再执行。

依次执行main中的方法,打印出相关信息,参考控制台结果分析程序。

注: static可以用于静态代码块,其类加载时先执行,只执行一次的性质不变。

发表评论

表情:
评论列表 (有 0 条评论,250人围观)

还没有评论,来说两句吧...

相关阅读

    相关 static关键字

    概述 关于 static 关键字的使用 ,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象

    相关 Java语法基础-static关键字

    static关键字说明 “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过...

    相关 java基础-关键字static

    在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员...