Java静态域(属性、方法、类)
来源:互联网 发布:mac mysql管理工具 编辑:程序博客网 时间:2024/05/20 18:46
如果将域定义为static,那么每个类中只有一个这样的域。作为对比,每一个对象对于所有的实例域却都有自己的一份拷贝。
例如,假定需要给每一个雇员赋予唯一的标识码。这里给Employee类添加一个实例域id和一个静态域nextId:
class Employee{ ...... private int id; private static int nextId = 1;}
现在,每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域。换句话说,如果有1000个Employee类的对象,
则有1000个实例域id,其中任一实例使用了setId()方法后,Employee类的静态域都会变成设置后的值。但是,只有一个静态域nextId。
即使没有一个雇员对象,静态域nextId也存在。它属于类,而不属于任何独立的对象。从静态域通过类名直接调用,实例域通过(类的)实例调用,也可佐证。
项目中遇到的一个例子:如果写一个类XDialog继承Dialog,XDialog里面有个域变量private List<String> items;我每次要显示一个对话框时都new XDialog();这时这个对话框就有了一个items拷贝,new N个XDialog就有N个对应的items拷贝。但若items是指当前用户的好友数目,那么XDialog对话框中就应该时时显示正确的上/下线好友,若是N个items拷贝,就每次都初始化了items,不能达到同步的目的,且效率低。这时用static关键字就解决了所有问题,只需声明privatestatic List<String> items;这时items为XDialog这个类所有,而非某个实现。Perfect!
再来看下静态方法:
静态方法是不能向对象实施操作的方法。
例如,Math.pow(x, a),它在运算的时候,不使用任何Math对象。换句话说,没有隐式的参数(this)。
可以认为静态方法是没有this参数的方法。(在一个非静态的方法中,this参数表示该方法的隐式参数。)作为对比:非静态方法的调用(this.)pow();
因为静态方法不能操作对象,所以不能在静态方法中访问实例域。但是,静态方法可以访问自身类中的静态域。
public static int getNextId(){ return nextId;//return static field}通过类名调用这个方法:int n = Employee.getNextId();
注:静态域不能直接访问实例域(因为它是与类相关的而不是某个对象),但实例域可直接访问静态域(因为实例域是派生于类的)。
如果harry是一个Employee对象,可用harry.getNextId()来替代Employee.getNextId()。不过,这种方式很容易让人迷惑。因为getNextId方法计算的结果与harry毫无关系。故建议使用类名,而不是对象来调用静态方法。
在下面两种情况下使用静态方法:
1.当一个方法不需要访问对象状态,其所需参数都是通过显式提供的(例如Math.pow)。
2.当一个方法只需要访问类的静态域(例如Employee.getNextId)。
接下来看下静态内部类:
有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类对象。为此,可以将内部类声明为static,以便取消产生的引用。
静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。
例如,定义静态内部类Pair:
class ArrayAlg{ public static class Pair{//不需要内部类引用外围对象,用static断绝这种引用。 private double first; private double second; public Pair(double f, double s){ first = f; second = s; } public double getFirst(){ return first; } public double getSecond(){ return second; } public static Pair minmax(double[] values){ double min = Double.MAX_VALUE; double max = Double.MIN_VALUE; for(double v:values){ if(min>v) min = v; if(max<v) max = v; } return new Pair(min,max); } }//end Pair}
其中,ArrayAlg是内部类,Pair是静态内部类。
在主main中:
ArrayAlg.Pair p = ArrayAlg.Pair.minmax(d);//d:double数组
System.out.println("min="+p.getFirst()+",max="+p.getSecond());
- Java静态域(属性、方法、类)
- java静态方法,静态属性
- 类方法、静态方法、属性
- python_静态属性,类方法,静态方法
- java(非)静态方法,(非)静态外部类访问静态属性总结
- java中静态属性,静态方法和静态初始化器
- Java的静态方法、静态属性、静态代码块
- 静态属性静态方法
- JAVA 静态属性、方法、代码块 day8
- 5.Static ,protect,属性和方法,静态方法(static)和实例方法,JAVA的静态变量、静态方法、静态类
- 从JVM内存管理的角度谈谈JAVA类的静态方法和静态属性
- 从JVM内存管理的角度谈谈JAVA类的静态方法和静态属性
- java中静态块,静态属性,方法的加载顺序
- freemarker之调用JAVA静态方法和静态属性
- 关于java中静态属性、静态方法的继承问题
- java类静态属性测试
- java静态变量,静态方法,静态类
- 类 静态方法,属性,类方法
- MST的Prim算法和Kruskal算法
- 干将莫邪(Sharp Tools)
- 数字电视表数据的过滤
- gun工具链与makefile
- JD 题目1459:Prime ring problem (dfs)
- Java静态域(属性、方法、类)
- JavaScript变量、作用域及内存问题
- python中的异常
- 利用TinyXML对mxl文件的读写
- 1010: [HNOI2008]玩具装箱toy
- IE的IF条件注释
- 1051: [HAOI2006]受欢迎的牛
- POJ 1573 Robot Motion(DFS)
- 看懂了这些图你就看懂了整个世界