一、定义
(一)什么是static
1.static方法就是没有this的方法,在static方法内部不能调用非静态方法,反过来是可以的,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。
2.被static修饰的成员变量和成员方法独立于该类的任何对象,也就是说,它不依赖类特定的实例,被类的所有实例共享,不要实例化就可以使用。
3.内存中独一份,在类加载时候完成内存分配,建议使用【类名.*】直接使用。
二、用法
(一)静态导入
1.我们平时使用一个静态方法的时候,都是【类名.方法名】,使用静态变量的时候都是【类名.变量名】。这样当代码中多次使用该类时候会写很多次类名,这种情况我们可以再顶部通过import导入该静态类,这样在代码中则可以直接使用该变量或者方法而不用再写前面的类名(不建议)。
2.因为很多不同的静态类有相同的方法名,所以在静态导入时候不要使用通配符(*),以免导入的方法或者变量阅读困难而难以维护。
1)正例: import static java.lang.Math.PI;
2)反例:import static java.lang.Math.*;
(二)静态变量
1.被static关键字修饰的变量叫做静态变量或者类变量,是属于类,在加载类信息时候完成内存分配,在内存中只有一份,通过【类名.变量】使用。
2.使用场景:对象中间共享值时候,或者经常被外部代码经常访问时候方便访问变量。
3.和final关键字一起使用,当修饰基本类型或者字符串类型表示引用和指向的实例都不可变,修饰容器类型,容器本身不可能但是容器内部保存元素可以修改。
(三)静态方法
1.一般类中的方法是用static修饰的,可以通过【类名.方法名】调用,也可以通过实例调用。静态方法内部不能调用实例变量或者实例方法,也不能使用this、super关键字,只能访问类的静态成员变量和方法,因此static独立于任何实例,而且static方法必须被实现不能用abstract修饰。
2.即使没有显示的声明为static,类的构造器也是静态方法。
3.可以被重载、隐藏但是不可以被覆盖。
1)覆盖是针对实例方法而言的,子类的实例方法不能覆盖父类的静态方法,子类的静态方法也不能覆盖父类的实例方法,若B覆盖了A的方法,那么不仅B不能访问A被覆盖的方法,将B转换成A(父类指向子类的实例)同样不能访问A被覆盖的方法(想调用需要super关键字)。
2)隐藏是针对静态方法和变量(静态变量或者实例变量)而言的,变量可以交叉隐藏(子类实例变量/静态变量可以隐藏父类的实例/静态变量),若B隐藏了A的变量或方法,那么B不能访问A被隐藏的变量或方法,但将B转换成A后可以访问A被隐藏的变量或者方法。
3)TTI(运行是类型检查)只针对覆盖,不针对隐藏:因为覆盖是动态绑定,是受RTTI约束的,隐藏不受RTTI约束,运行时类型为引用变量所指向的对象的类型,编译时类型是引用变量自身的类型。
(四)静态代码段
1.静态代码块就是用static修饰的用{}括起来的代码段,它的主要目的就是对静态属性进行初始化。
1)初始化实例变量:如果一个类中存在若干个构造函数,这些构造函数都需要对实例变量进行初始化,如果我们直接在构造函数中实例化,必定会产生很多重复代码,繁琐和可读性差。这里我们可以充分利用构造代码块来实现。这是利用编译器会将构造代码块添加到每个构造函数中的特性。
2)初始化实例环境:一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景。我们可以利用构造代码块来创建此场景,尤其是该场景的创建过程较为复杂。构造代码会在构造函数之前执行。
2.静态代码块可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
1)程序大概执行顺序:静态属性 > 静态方法声明 > 静态块 > 动态属性> 普通方法声明 > 构造块 > 构造方法。
2)继承中的初始化顺序:父类静态代码区和父类静态成员 > 子类静态代码区和子类静态成员 > 父类非静态代码区和普通成员 > 父类构造函数 > 子类非静态代码区和普通成员 > 子类构造函数。
(五)静态内部类
1.被static修饰的内部类,它可以不依赖于外部类实例对象而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问内部类中的静态成员和静态方法(包括私有类型)。
2.只有内部类才能被static修饰,普通的类不可以。
PS:在内部类章节中详解
三、注意事项
(一) 使用场景
1.Staitc修饰变量时候,虽然可以使对象共享属性,但是也导致该属性变得难以控制,因为任何地方都可能改变它,所以很少这样使用,及时有这样的场景也会通过其他的方式来实现共享。