Java中static、final、static final的区别
final:
定义的基本类型的值是不可改变的,但是fianl定义的引用对象的值是可以改变的【引用对象示例: private static int
counter; private int id=counter++; counter值是0, id就是引用对象counter】
比较对象 | final | static | static final |
---|---|---|---|
修饰 | 属性,方法,类,局部变量 | 属性,方法,代码段,内部类(静态内部类或嵌套内部类)不可以修饰局部变量 | 可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用 |
修饰的属性的初始化 | 可以在编译期,也可以在运行期,初始化后不能被改变 | 初始化在编译期(类加载的时候),初始化后能改变 | 永远只有一个值,static一直放在内存中,就是为了实现一个系统的缓存作用的,其生命周期直到应用程序退出结束。 |
修饰的属性跟对象关系 | 跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值 | 所有对象都只有一个值 | |
与this、super关系 | final跟具体对象有关 | static跟具体对象无关 | |
修饰的属性 | 表明属性是一个常数(创建后不能被修改) | 强调它们只有一个 | tatic final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问 |
使用原因 | 1.把方法锁定,确保在继承中使用方法行为不变,并且不会被覆盖;2.效率,如果一个方法指明为final,就是同意编译器将针对该方法的所有调用都转为内嵌调用。 转为内嵌调用的目的是节省开销,因为编译器发现一个final方法调用命令时,会跳过程序代码这种正常方式而执行方法调用机制(将参数压入栈,跳至方法代码处并执行,然后跳回并清理栈中的参数,处理返回值),并且以方法体中的实际代码的副本来替代方法调用。但是如果一个方法很大,程序很膨胀,就会看不到内嵌带来的任何性能的提高。 | ||
继承实现关系 | final类不能被继承,没有子类,方法不能被覆盖,final类中的方法默认是final的 |
成员变量与局部变量的区别
比较对象 | 成员变量 局部变量 |
---|---|
在类中的位置 | 在类中方法外 |
在内存中的位置 | 在堆内存 |
生命周期不同 | 随着对象的创建而存在,随着对象的消失而消失 |
初始化值不同 | 有默认值初始化 |
另外,局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。