在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。
1、修饰类: 当用final修饰一个类时,表明这个类是最终类,不能被继承。如果一个类你不想让它被继承,就可以用final进行修饰。
2、修饰方法:使用final修饰的方法不能被子类重写。(最终方法)
3、修饰变量: 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
由final修饰的变量,是常量,一旦初始化后,它的值不能被修改,即不能被重新赋值,主要是项目中应用的常量的抽取:比如URL常量、路径常量、数字常量等.不能让人轻易修改。
注意: 当final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。
public static final String URL_GET = "/Api/GetMaintenanceType.html";//保养列表
————————————————————————————————>
Static关键字: 只能用于修饰成员变量和成员方法。
Static修饰的成员变量就成了类变量,随着类的加载而加载,生命周期和类一样。
Static修饰的成员方法变成了类方法,可以直接通过类名调用。和.class一样存在于方法区。
非静态的成员方法与成员变量的调用,只能通过创建对象调用。类名.方法名等;而静态的成员可以通过类名和创建对象调用(尽量用类名调用,不要创建对象)。
被修饰的成员有以下特点:
1)随着类的加载而加载、
2)优先于对象存在、
3)被所有对象所共享(比较节约空间)、(可以用代码证明)
4)可以直接被类名调用, Constant.BASE_URL、NetManager.getData();
注意事项:
1)静态方法只能访问静态的成员变量,不能访问非静态的成员变量。 为什么?因为静态成员先于对象存在,比对象先创建。当静态成员存在时,对象还没有创建。他们的生命周期不一样。但是非静态的可以访问静态的。
2)静态方法中不可用this/super关键字。为什么:this指向调用本方法的对象的引用(对象还没有创建呢)
由static修饰的成员变量、成员方法和类同时进行加载到内存,所以优先于对象存在。
一般在工具类中使用静态、static;
类是什么时候加载到内存的? 对象是什么时候加载到内存的?
内存分区图:
堆内存: 用于存储对象
栈内存: 用于存储基本类型变量区,使用完成后,所占空间会自动释放。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
静态成员与非静态成员的区别:
生命周期:
静态成员随着类的加载而加载,随着类的消失而消失,生命周期长;
普通成员随着对象的存在而存在,随着对象的消失而消失。
存放位置:静态成员存在于方法区中,非静态成员存在于堆中。
static对性能的影响:
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”! 常量必须要加static关键字修饰
static就是静态变量,声明为static的变量实质上就是全局变量,如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象!
class ViewHolder {
TextView item_by_text1,item_by_text2;
}
没有必要时请不用使用静态变量,生命周期比较长,不能被回收,占用内存。