Java静态域、静态常量和静态方法
2016-09-09 17:17
260 查看
在几乎所有的程序里,main方法都被标记为static修饰符。那么我们就来讨论一下这个修饰符。
现在,每一个员工都有自己的一个 id 域,但这个类的所有实例将共享一个 nextId 域。换句话说,如果有 1000 个员工类的对象,则有 1000 个实力域 id。但是,只有一个静态域 nextId。即使没有一个员工对象,静态域 nextId 也存在。它属于类,而不属于任何独立的对象。(在绝大多数的面向对象程序设计语言中,静态域被称为类域。术语“static”只是沿用了 C++ 的叫法,并无实际意义。)
下面有代码来演示一下:
运行结果为:
可以看到,nextId 是在不断增加的,有5个对象,但是只有一个静态域 nextId。
在程序中,可以通过 Mathematics.PI 的形式获得这个常量。
如果 static 被省略,PI 就变成了 Mathematics 类的一个实例域。需要通过 Mathematics 类的对象访问,并且每一个 Mathematics 类的对象都有自己的一个 PI 的拷贝。
可以认为,静态方法时没有 this 参数的方法。
Employee 类的静态方法不能访问 Id 实力域,因为它不能操作对象。但是,静态方法可以访问自身中的静态域。下面是一个使用静态方法的示例:
但是可以通过调用这个方法:
当然,这个方法是可以省略 static 关键字的,但是,需要通过 Employee 类对象引用调用这个方法。
注意:可以使用对象调用静态方法。例如,如果 temp 是一个 Employee 对象,可以用 temp.getNextId() 代替 Employee.getNextId()。不过,这种方式很容易造成混淆,其原因是 getNextId 方法计算的结果与 temp 毫无关系。但是建议使用类名,而不是对象来调用静态方法。
在以下两种情况下使用静态方法:
1.一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)。
2.一个方法只需要访问类的静态域(例如:Employee.getNextId)。
一、静态域
如果将一个域定义为 static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却有自己的一个拷贝。例如,在前面文章中用到的 Employee 类中,我们增加一个 ID 号。这里给它添加一个实例域 id 和静态域 nextId。class Employee{ private static int nextId = 1; //静态域 private int id; //实力域 ... }
现在,每一个员工都有自己的一个 id 域,但这个类的所有实例将共享一个 nextId 域。换句话说,如果有 1000 个员工类的对象,则有 1000 个实力域 id。但是,只有一个静态域 nextId。即使没有一个员工对象,静态域 nextId 也存在。它属于类,而不属于任何独立的对象。(在绝大多数的面向对象程序设计语言中,静态域被称为类域。术语“static”只是沿用了 C++ 的叫法,并无实际意义。)
下面有代码来演示一下:
public class EmployeeTest { public static void main(String[] args){ Employee[] temp = new Employee[5]; for (int i = 0; i < 5; i++) temp[i] = new Employee(); for (int i = 0; i < 5; i++){ temp[i].setID(); System.out.println("My number is: " + temp[i].getID()); } }// main } class Employee{ private int id; private static int nextId = 1; public Employee(){} public void setID(){ id = nextId; nextId++; } public int getID(){ return id; } }
运行结果为:
可以看到,nextId 是在不断增加的,有5个对象,但是只有一个静态域 nextId。
二、静态常量
静态变量用的比较少,但是静态常量却使用得比较多。例如,在 Mathematics 类中定义了一个静态常量:public class Mathematics{ ... public static final double PI = 3.14159265358979323846; ... }
在程序中,可以通过 Mathematics.PI 的形式获得这个常量。
如果 static 被省略,PI 就变成了 Mathematics 类的一个实例域。需要通过 Mathematics 类的对象访问,并且每一个 Mathematics 类的对象都有自己的一个 PI 的拷贝。
三、静态方法
静态方法是一种不能向对象实施操作的方法。例如,Math 类的 pow 方法就是一个静态方法。表达式Math.pow(x, a)计算x的a次幂。在运算时,不使用任何的 Math 对象。换句话,没有隐式的参数。
可以认为,静态方法时没有 this 参数的方法。
Employee 类的静态方法不能访问 Id 实力域,因为它不能操作对象。但是,静态方法可以访问自身中的静态域。下面是一个使用静态方法的示例:
public static int getNextId(){ return nextId; //returns static field }
但是可以通过调用这个方法:
int n = Employee.getNextId();
当然,这个方法是可以省略 static 关键字的,但是,需要通过 Employee 类对象引用调用这个方法。
注意:可以使用对象调用静态方法。例如,如果 temp 是一个 Employee 对象,可以用 temp.getNextId() 代替 Employee.getNextId()。不过,这种方式很容易造成混淆,其原因是 getNextId 方法计算的结果与 temp 毫无关系。但是建议使用类名,而不是对象来调用静态方法。
在以下两种情况下使用静态方法:
1.一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)。
2.一个方法只需要访问类的静态域(例如:Employee.getNextId)。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序