静态字段与静态方法

关键字 static

 static 关键字可以标注在类的字段中,也可以标注来方法上,其中的含义各有不同,下面进行分析。

静态字段

 如果将一个字段定义为static,每个类都有这样一个字段。而对于非静态的字段,每个对象都有自己的一个副本。

代码如下:

class Demo{
    private static String name = "chen";
    private int id;
}

 现在,每一个Demo对象都有一个id字段,但时这个类的所有实例将共享同一个name字段。

 也就是说,比如有100个Demo对象,则有100个实例字段id,分别对应每一个对象。但是,这100个对象只有一个静态字段name,所有的实例都共享同一个name字段。即便没有Demo对象,静态字段name也存在。它时属于类的而不是属于任何一个对象的。

小案例:

public class Demo {
    private static int i = 0;

    public void add(){
        i++;
        System.out.println(i);
    }

    public static void main(String[] args) {
        Demo demo1 = new Demo();
        Demo demo2 = new Demo();
        Demo demo3 = new Demo();
        Demo demo4 = new Demo();
        Demo demo5 = new Demo();

        demo1.add();
        demo2.add();
        demo3.add();
        demo4.add();
        demo5.add();
    }
}

// 输出结果:
1
2
3
4
5

静态方法

 静态方法不是在对象上执行的。而是通过 类名.方法名 这样执行的。
例如:

public class Demo {

    private static int i = 0;

    private int j = 0;	
    
    public static void hello(){
        System.out.println("hello world");
    }

    public static void main(String[] args) {
        Demo.hello();
    }
}
// 输出结果
hello world
  • 上面的代码调用hello()方法,它不要要任何的Demo 对象,直接通过类名就可以调用。
  • 可以认为静态方法时没有this参数的方法
  • Demo类的静态方法是不能访问 j 字段的,因为它不能在对象上执行操作,但是可以在静态方法中访问静态字段。
  • 当然,静态方法也可以通过对象来调用,但是这样会造成混淆,所以建议的使用方法是通过类名调用。

如图所示:
222.png

 在静态方法中使用非静态字段会直接报错,但是使用静态变量却没有问题

静态代码块

写法
public class Demo {
    private static int i = 0;

    static {
        System.out.println("static");
    }

    public static void main(String[] args) {

    }
}
// 运行结果
static
特点
  • 随着类的加载而执行,而且只执行一次
  • 执行优先级高于非静态的初始化块
  • 它会在类初始化的时候执行一次,执行完成便销毁
  • 它仅能初始化类变量,即static修饰的数据成员
执行顺序
  • 静态代码块
  • 非静态代码块
  • 构造函数
# 基础 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×