static关键字

1.static属性

在java类中声明的属性未加static修饰,它们必须依赖于该类的对象(实例)而存在——该类的每一个实例都会封装携带各自不同的一份,其取值也可以各不相同,非static属性也称“实例变量”。
而static属性的差别在于,该属性由其所在类共享——无论创建多少个该类的对象,甚至不创建任何对象,该属性都将存在,也只存在唯一的一份,因此static属性也称“类变量”或“静态变量”(不受对象的动态创建和销毁的影响)。可以将类变量理解为在类范围内的共享变量,类似于其他语言的全局变量。下面举个例子来展示static属性的用法。

public class Person {
    private int id;
    public static int total=0;
    public Person(){
        total++;
        id=total;
    }
}
public class Test {

    public static void main(String[] args) {//p1

        Person.total=100;                   //p2
        System.out.println(Person.total);
        Person p1=new Person();
        Person p2=new Person();             //p3
        System.out.println(Person.total);
    }

}
//程序运行结果如下:
100
102

Person类中非static属性id用于记录个人身份证号码,而static属性total用于记录总人口。由于总人口具有共享数据的性质,不会因人而异,因此只要保存一份即可,没必要每个Person类的实例都封装一份,否则将来人数变化时要同时修改多份会很繁琐且难以保证同步。

2.static方法

和static属性相同,也可以在声明Java方法时使用static关键字来修饰,static方法同样由整个类共有,而不依赖特定的对象。也就是说,static方法不必使用“<对象名>.<方法名>(<实参列表>)”的方式调用,也可以使用“<类名>.<方法名>(<实参列表>)”的方式直接调用。static方法的具体用法如下:

public class Person {
    private int id;
    public static int total=0;
    public Person(){
        total++;
        id=total;
    }
    public int getId() {
        return id;
    }
    public static int getTotalPerson(){
        return total;
    }
}
public class Test {

    public static void main(String[] args) {

        System.out.println(Person.getTotalPerson());
        Person p1=new Person();
        System.out.println(p1.getTotalPerson());
        System.out.println(Person.getTotalPerson());
    }

}
//程序运行结果如下:
0
1
1

需要注意的是,由于static方法的执行不依赖特定实例,即可以不创建任何对象而直接使用类名来调用,因此在其方法体中不能在直接使用其所在类的实例变量,也不允许使用关键字this。同样的在static方法中也不允许不创建对象而直接调用所在类的非static方法,因为非static方法必须由对象调用。

3.static代码块

在定义Java类时,还可以在类体中、方法的外部包含一个或多个static标记的语句块,这些语块仅在其所属的类被载入JVM时被执行一次,通常用于一次性的初始化工作。具体用法如下:

public class Person {
    public static int total;
    static{
        total=100;
        System.out.println("int static block");
    }

}
public class Test {

    public static void main(String[] args) {

        System.out.println("total="+Person.total);
        System.out.println("total="+Person.total);
    }

}
//程序运行结果如下:
int static block
total=100
total=100

static初始化块无法人为调用,而只是在其被所在类被载入JVM内存时自动执行一次,其具体时机是在该类的所有static属性已经被分配空间、默认初始化和显式初始化之后,在执行任何其他代码之前。如果一个类中同时出现多个static块,则按照其出现的先后顺序来执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值