12.Java静态变量与常量
转载请保留原文链接: http://dashidan.com/article/java/basic/12html
转载请保留原文链接: http://dashidan.com/article/java/basic/12html
`static`修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们. 因此`static`修饰的变量和方法,可以在它所属的对象创建之前访问,不用创建对象.
① 静态变量
访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名</p>
按照是否静态的对类成员变量进行分类可分两种: * 被static修饰的变量,叫静态变量或类变量. * 没有被static修饰的变量,叫实例变量.
1.静态变量与实例变量区别:
- 静态变量在内存中只有一个拷贝(节省内存), JVM只为静态分配一次内存.在加载类的过程中完成静态变量的内存分配. 可用类名直接访问, 当然也可以通过对象来访问(不推荐).
- 对于实例变量, 每创建一个实例, 就会为实例变量分配一次内存, 实例变量可以在内存中有多个拷贝, 互不影响, 需要通过实例的引用来访问.
2.静态变量应用场景:
- 在对象之间共享值时
- 方便访问变量时
猫都有4条腿,2只眼睛一张嘴.这3条属性是猫的通用属性,我们便可以把这三个属性设置为static
静态变量.我们在定义静态变量时,通常将所有字母大写,与实例变量作区分.
静态方法可以直接通过类名调用, 任何的实例也可以调用.因此静态方法只能访问所属类的静态变量和静态方法, 不能用this
和super
关键字.不能直接访问所属类的实例变量和实例方法(没有static修饰的成员变量和成员方法).
示例代码:
package com.dashidan.lesson11;
/**
* 大屎蛋教程网-dashidan.com
* <p>
* Java教程基础篇: 11. Java静态变量与常量
*/
public class Demo1 {
public static void main(String[] args) {
/** 出处猫的静态属性*/
System.out.println("MOUSE_NUM: " + Cat.MOUSE_NUM);
System.out.println("EYE_NUM: " + Cat.EYE_NUM);
System.out.println("LEG_NUM: " + Cat.LEG_NUM);
}
}
Cat类:
package com.dashidan.lesson11;
/**
* 大屎蛋教程网-dashidan.com
* <p>
* Java教程基础篇: 11. Java静态变量与常量
* Cat 类
*/
public class Cat {
public static int MOUSE_NUM = 1;
public static int EYE_NUM = 2;
public static int LEG_NUM = 4;
}
输出:
MOUSE_NUM: 1
EYE_NUM: 2
LEG_NUM: 4
② Java常量
final
是Java的一个保留关键字, 可以声明成员变量、方法、类以及局部变量. 被声明final的变量, 一但赋值便不能再次修改.编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误.final
变量经常和static
关键字一起使用作为常量
.
例:
public static final WEB_NAME = "大屎蛋教程网."
public static final WEB_URL = "http://dashidan.com"
1.final关键字要点
- 方法前面加上final关键字,代表这个方法不可以被子类的方法重写.
- 类名前面加上final关键字,代表这个方法不可以被继承.
- final关键字可以用于成员变量、局部变量、方法以及类.
- final成员变量必须在声明的时候初始化或者在构造器中初始化, 否则就会报编译错误.
- 不能对final变量再次赋值.
- fina局部变量必须在声明时赋值.
- 在匿名类中所有变量都必须是final变量.
- final方法不能被重写.
- final类不能被继承.
- 接口中声明的所有变量本身是final的.
- final和abstract这两个关键字是反相关的, final类就不可能是abstract的.
- final方法在编译阶段绑定, 称为静态绑定(static binding).
- 没有在声明时初始化final变量的称为
空白final变量
(blank final variable), 必须在构造器中初始化, 或者调用this()初始化. 否则编译器会报错. - 将类、方法、变量声明为final能够提高性能, 这样JVM就有机会进行估计,然后优化.
- 按照Java代码惯例,final变量就是常量, 而且通常常量名要大写
- 对于集合对象声明为final指的是引用不能被更改, 但可以向其中增加, 删除或者改变内容.
涉及到了很多类的继承相关的概念, 可以参考Java教程进阶篇Java对象相关的文章后, 再回头看这些知识就很好理解了.Java对象