静态变量,静态方法以及常量详解——Java学习笔记(三)
- 静态变量和静态方法
- 实例变量和静态变量的区别
- 静态变量和静态方法的声明
- 静态变量和静态方法的调用
- 判断一个变量或方法是实例的还是静态的
- 注意事项
- 常量
Java学习笔记(三)
静态变量和静态方法
实例变量和静态变量的区别
- 实例变量是绑定到类的某个特定实例的,它是不能被同一个类的不同对象所共享的。
- 如果想让一个类的所有实例共享数据,就要使用静态变量(static variable), 也称为类变量(class variable)
静态变量将变量值存储在一个公共的内存地址。因为它是公共的地址, 所以如果某一个对象修改了静态变量的值,那么同一个类的所有对象都会受到影响。如下图:
静态变量和静态方法的声明
声明一个静态变量或定义一个静态方法,在这个变量或方法的声明中加上修饰符 static即可。
静态变量 numberOfObjects 和静态方法 getNumberOfObjects() 可以如下声明:
static int numberOfObjects;
static int getNumberObjects() { return numberOfObjects; }
静态变量和静态方法的调用
被调用:
- 实例方法和实例数据都是属于实例的,所以它们在实例创建之后才能使用。它们是通过引用变量来访问的。
- 静态方法和静态数据 可以通过引用变量或它们的类名来调用。
调用:
- 实例方法可以调用实例方法和静态方法,以及访问实例数据域或者静态数据域。
- 静态方法可以调用静态方法以及访问静态数据域。
- 静态方法不能调用实例方法或者访问实例数据域,因为静态方法和静态数据域不属于某个特定的对象。
- 静态成员和实例成员的关系总结在下图中:
总而言之:实例啥都可以搞,静态只能搞自己(动可以静,静不能动)
判断一个变量或方法是实例的还是静态的
一个常见的设计错误就是将一个本应该声明为静态的方法声明为实例方法。判断一个变量或方法是实例的还是静态的,要遵循以下原则:
- 如果一个变量或方法依赖于类的某个具体实例,那就应该将它定义为实例变量或实例方法。
- 如果一个变量或方法不依赖于类的某个具体实例,应该将它定义为静态变量或静态方法。
- 例如:
每个圆都有自 己的半径,半径都依赖于某个具体的圆。因此,半径 radius 就是 Circle 类的一个实例变量。由于getArea()方法依赖于某个具体的圆,所以,它也是一个实例方法。
在 Math 类中没有一个方法是依赖于一个特定实例的,例如:random、pow、sin 和 cos。因此,这些方法都是静态方法。main 方法也是静态的,可以从类中直接调用。
注意事项
- 在UML 类图中,静态变量和静态方法 都是以下划线标注的。
- Java 支持静态方法和静态变量,无须创建类的实例就可以调用静态方法(static method)。
- Math 类中所有的方法都是静态的。main 方法也是静态方法。
- 使用 “类名 .方法名(参数) ” 的方式调用静态方法,使用 “类名 .静态变量” 的方式访问静态变量。这会提高可读性,因为可以很容易地识别出类中的静态方法和数据。
- 一个类中的main函数是不能直接调用类中的实例函数和方法,原因就是main永远是static静态函数。要调用就得先创建对象,借助一个实例化对象调用
常量
类中的常量是被该类的所有对象所共享的。因此,常量应该声明为 final static
例如, Math 类中的常量 PI 是如下定义的:
final static double PI = 3.14159265358979323846;