假设域被定义为static,那么每个类中仅仅有一个这种域。作为对照,每个对象对于全部的实例域却都有自己的一份拷贝。

比如,假定须要给每个雇员赋予唯一的标识码。

这里给Employee类加入一个实例域id和一个静态域nextId:

  1. class Employee{
  2. ......
  3. private int id;
  4. private static int nextId = 1;
  5. }

如今,每个雇员对象都有一个自己的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。不能达到同步的目的,且效率低。这时用statickeyword就攻克了全部问题,仅仅需声明privatestatic
List<String> items;这时items为XDialog这个类全部,而非某个实现。Perfect!

再来看下静态方法

静态方法是不能向对象实施操作的方法。

比如,Math.pow(x, a),它在运算的时候,不使用不论什么Math对象。换句话说,没有隐式的參数(this)。

能够觉得静态方法是没有this參数的方法。(在一个非静态的方法中。this參数表示该方法的隐式參数。)作为对照:非静态方法的调用(this.)pow();

由于静态方法不能操作对象,所以不能在静态方法中訪问实例域。可是。静态方法能够訪问自身类中的静态域

  1. public static int getNextId(){
  2. return nextId;//return static field
  3. }

通过类名调用这种方法:int n = Employee.getNextId();

注:静态域不能直接訪问实例域(由于它是与类相关的而不是某个对象),但实例域可直接訪问静态域(由于实例域是派生于类的)。

假设harry是一个Employee对象。可用harry.getNextId()来替代Employee.getNextId()。只是,这样的方式非常easy让人迷惑。由于getNextId方法计算的结果与harry毫无关系。故建议使用类名。而不是对象来调用静态方法。

在以下两种情况下使用静态方法:

1.当一个方法不须要訪问对象状态。其所需參数都是通过显式提供的(比如Math.pow)。

2.当一个方法仅仅须要訪问类的静态域(比如Employee.getNextId)。

接下来看下静态内部类

有时候,使用内部类仅仅是为了把一个类隐藏在另外一个类的内部。并不须要内部类引用外围类对象。为此,能够将内部类声明为static。以便取消产生的引用。

静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其它全部内部类全然一样。

比如。定义静态内部类Pair:

  1. class ArrayAlg{
  2. public static class Pair{//不须要内部类引用外围对象。用static断绝这样的引用。
  3. private double first;
  4. private double second;
  5. public Pair(double f, double s){
  6. first = f;
  7. second = s;
  8. }
  9. public double getFirst(){
  10. return first;
  11. }
  12. public double getSecond(){
  13. return second;
  14. }
  15. public static Pair minmax(double[] values){
  16. double min = Double.MAX_VALUE;
  17. double max = Double.MIN_VALUE;
  18. for(double v:values){
  19. if(min>v) min = v;
  20. if(max<v) max = v;
  21. }
  22. return new Pair(min,max);
  23. }
  24. }//end Pair
  25. }

当中,ArrayAlg是内部类。Pair是静态内部类。

在主main中:

ArrayAlg.Pair p = ArrayAlg.Pair.minmax(d);//d:double数组

System.out.println("min="+p.getFirst()+",max="+p.getSecond());

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Java静态字段(属性、方法、类别)的更多相关文章

  1. c#基础3-方法的重载静态和非静态,字段属性,方法

    方法的重载概念:方法的重载指的就是方法的名称相同给,但是参数不同.参数不同,分为两种情况1).如果参数的个数相同,那么参数的类型就不能相同.2).如果参数的类型相同,那么参数的个数就不能相同.***方 ...

  2. C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性

    http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...

  3. C# static 字段初始值设定项无法引用非静态字段、方法或属性

    问题:字段或属性的问题字段初始值设定项无法引用非静态字段.方法 下面代码出错的原因,在类中定义的字段为什么不能用? public string text = test(); //提示 字段或属性的问题 ...

  4. C# 字段初始值无法引用非静态字段、方法或属性( 类内部变量初始化)

    问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 在类中  变量赋值其他变量报错? public class TestClass{  public TestClass()  {  }  pu ...

  5. 廖雪峰Java2面向对象编程-5包和classpath-1静态字段和方法

    1.静态字段 1.1定义:用static修饰的字段称为静态字段 普通字段在每个实例中都有自己的一个独立的空间 静态字段只有1个共享空间,所有实例都共享该字段. public class Person{ ...

  6. C#-类 字段 属性 方法 特性

    方法的签名 包括参数个数.参数类型.方法返回值 base和this关键字 1.使用base关键字,就可以使用父类中的字段.属性.方法 2.一旦父类中存在有参数的构造函数,那么子类就必须使用base来覆 ...

  7. [原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. python基础(26):类的成员(字段、方法、属性)

    1. 字段 字段:包括普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 字段的定义和使用: class Province: # ...

  9. 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法

    Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法    获取Class类实例的方法:   类名.class   实例名.getClass()   Class.forNam ...

随机推荐

  1. 8 shell命令之find

    find命令,像cd一样经常使用.只是可能大多数时间仅仅要那么一两个參数就足够使用了.或者说,勉强够用了.可是当我们主动的去翻看一下find的手冊,会发现原来更实用的功能都没实用到. 本文结合自己的使 ...

  2. POJ---2243 Knight Moves 使用A*算法的广度优先搜索

    题目链接:http://poj.org/problem?id=2243 启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省 ...

  3. c# Use Properties Instead of Accessible Data Members

    advantage of properties: 1 properties can be used in data binding, public data member can not. 2 dat ...

  4. silverlight 和winform的结合使用

    silverlight 和winform的结合使用比较简单,将silverlight承载在页面上,页面运行在winform上的webbrowser中即可. 这样的情况下,我没找到页面中silverli ...

  5. [TWRP 2.8.4] for 小米2S/2SC 支持中英文切换

    其中这个 twrp 2.8.4 在18号的下午已经编译好了. 经历了2个小时的代码修改,再经过后期的调试,中英文双语版本的twrp出炉了. 下面上几张图: 图片1:为英文界面 图片2: 图片3:中文界 ...

  6. 【原创】纯OO:从设计到编码写一个FlappyBird (三)

    第二部分请点这里 下面首先来实现Bing接口! 实现Bing接口的类取名SimpleBing. 容易发现,SimpleBing类总的来说要向下,但点击一下又得向上,向上到了一定界限又得向下,但我们又只 ...

  7. 矩形类定义【C++】

    Description 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. Inp ...

  8. unity3d简单的相机跟随及视野旋转缩放

    1.实现相机跟随主角运动 一种简单的方法是把Camera直接拖到Player下面作为Player的子物体,另一种方法是取得Camera与Player的偏移向量,并据此设置Camera位置,便能实现简单 ...

  9. java提高篇(十)-----强制类型转换

    在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  10. oracle在imp订单具体解释

    oracle在imp订单具体解释 Oracle导入实用程序(Import utility)同意从数据库中提取数据,和写入数据到一个操作系统文件项目.imp所用的基本格式:imp[username[/p ...