static关键字特点
static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量。
static修饰的成员被所有的对象共享。
static优先于对象存在,因为static的成员随着类的加载就已经存在。
static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。
static修饰的数据是共享数据,对象中的存储的是特有的数据。
成员变量和静态变量的区别
1、生命周期的不同:
成员变量随着对象的创建而存在随着对象的回收而释放。
静态变量随着类的加载而存在随着类的消失而消失。
2、调用方式不同:
成员变量只能被对象调用。
静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)
3、别名不同:
成员变量也称为实例变量。
静态变量称为类变量。
4、数据存储位置不同:
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
静态使用时需要注意的事项
静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
静态方法中不可以使用this或者super关键字。
主函数是静态的
static关键字的基本用法
1.static修饰成员变量
(1)当分析对象中所具备的成员变量的值都是相同的。这时这个成员就可以被静态修饰。
(2)只要是数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。
(3)如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,是静态的。
对静态变量的引用有两种方式:
类.静态变量
对象.静态变量
静态变量无需实例化对象,直接通过类名即可访问。而没有static修饰的成员变量,则需要首先由类实例化对象,再通过对象访问该成员变量才可以。
2.static修饰成员方法
(1)static的另一个作用,就是修饰成员方法。相比于修饰成员属性,修饰成员方法对于数据的存储上面并没有多大的变化,因为我们从上面可以看出,方法本来就是存放在类的定义当中的。
(2)static修饰成员方法最大的作用,就是可以使用”类名.方法名”的方式操作方法,避免了先要new出对象的繁琐和资源消耗。
(3)static修饰的方法成为类的方法,使用时通过“类名.方法名”的方式就可以方便使用,相当于定义了一个全局的函数(只要导入该类所在的包即可)。所以相应地,非静态方法则还是要通过实例化对象,再通过“对象.方法名”的方式访问。
(4)由于静态方法可以直接通过类名调用,说明调用静态方法的时候,是不存在对象的,所以,静态方法中不能有this与super关键字!并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用,即使存在类实例化的对象,也不清楚具体调用哪一个对象的非静态成员变量或者方法。
静态方法只能访问所属类的静态成员变量和成员方法。但是反过来,非静态方法是可以访问静态方法与静态成员变量的。
3.static 修饰代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
4.static内部类
static内部类是指被申明为static的内部类,他可以不依赖于外部类实例对象而被实例化,而通常的内部类需要外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态成员方法,只有内部类才能被申明为static。