javaSE_8系列博客——Java语言的特性(三)--类和对象(13)--理解类的成员
来源:互联网 发布:淘宝网齐峰堂足宝粉 编辑:程序博客网 时间:2024/06/05 18:20
在本节中,我们讨论使用static关键字来创建属于该类的字段和方法,而不是该类的一个实例。
类变量(静态字段):
当从相同的类蓝图创建一些对象时,它们各自有不同的实例变量副本。在Bicycle类的情况下,实例变量是节奏,齿轮和速度。每个自行车对象都有自己的这些变量的值,存储在不同的内存位置。
有时候,您想要有所有对象共有的变量。这是通过static修饰符来实现的。在其声明中具有静态修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,它位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类的实例的情况下操作类变量。
例如,假设要创建一些“Bicycle”对象,并为每个序列号分配一个序列号,从第一个对象开始。该ID号对于每个对象是唯一的,因此是一个实例变量。同时,您需要一个字段来跟踪已创建了多少个自行车对象,以便您知道要分配给下一个的ID。这样一个领域与任何个体对象无关,而与整个class无关。为此,您需要一个类变量numberOfBicycles,如下所示:
public class Bicycle { private int cadence; private int gear; private int speed; // add an instance variable for the object ID private int id; // add a class variable for the // number of Bicycle objects instantiated private static int numberOfBicycles = 0; ...}
类变量由类名本身引用,如同
Bicycle.numberOfBicycles
注意:
您还可以使用对象引用引用静态字段:myBike.numberOfBicycles但是不鼓励这种做法,因为它并不能清楚知道它们是类变量。
您可以使用Bicycle构造函数设置id实例变量并增加numberOfBicycles类变量:
public class Bicycle { private int cadence; private int gear; private int speed; private int id; private static int numberOfBicycles = 0; public Bicycle(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; // increment number of Bicycles // and assign ID number id = ++numberOfBicycles; } // new method to return the ID instance variable public int getID() { return id; } ...}
类方法(静态方法):
Java编程语言支持静态方法以及静态变量。应该使用静态方法在其声明中使用静态修饰符,而不需要创建该类的实例,如
ClassName.methodName(args)
注意:
您还可以使用对象引用引用静态字段:instanceName.methodName(args)但是不鼓励这种做法,因为它并不能清楚知道它们是类方法。
静态方法的常见用途是访问静态字段。例如,我们可以添加一个静态方法到Bicycle类来访问numberOfBicycles静态字段:
public static int getNumberOfBicycles() { return numberOfBicycles;}
实例变量和类变量之间的常见组合关系(并不是所有的情况都可以相互访问)
- 实例方法可以直接访问实例变量和实例方法。
- 实例方法可以直接访问类变量和类方法。
- 类方法可以直接访问类变量和类方法。
- 类方法无法直接访问实例变量或实例方法 - 它们必须使用对象引用。此外,类方法不能使用this关键字,因为没有这个引用的实例。
常量
静态修饰符与最终修饰符组合也用于定义常量。最终修饰符表示此字段的值不能更改。
例如,以下变量声明定义了一个名为PI的常量,其值为pi的近似值(圆周长与其直径的比率)
- static final double PI = 3.141592653589793;
以这种方式定义的常量不能重新分配,如果您的程序尝试这样做,则是编译时错误。按照惯例,常数值的名称拼写为大写字母。如果名称由多个单词组成,则单词将以下划线(_)分隔。
注意:
如果一个原始类型或一个字符串被定义为一个常量,并且该值在编译时是已知的,则编译器将使用该值代替该代码中的常量名称。这被称为编译时常数。如果外界的常数值发生变化(例如,如果立法规定pi实际上应该是3.975),则需要重新编译使用该常量的任何类来获取当前值。
- javaSE_8系列博客——Java语言的特性(三)--类和对象(13)--理解类的成员
- javaSE_8系列博客——Java语言的特性(三)--类和对象(4)--声明成员变量
- javaSE_8系列博客——Java语言的特性(三)--类和对象(9)--对象的创建
- javaSE_8系列博客——Java语言的特性(三)--类和对象(10)--对象的使用
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--类成员的访问控制
- javaSE_8系列博客——Java语言的特性(三)--类和对象(8)--对象
- javaSE_8系列博客——Java语言的特性(三)--类和对象(3)--类的声明
- javaSE_8系列博客——Java语言的特性(三)--类和对象(2)--类(宏观概述)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(15)--嵌套类
- javaSE_8系列博客——Java语言的特性(三)--类和对象(1)--概述
- javaSE_8系列博客——Java语言的特性(三)--类和对象(5)--定义方法
- javaSE_8系列博客——Java语言的特性(三)--类和对象(11)--从方法返回值
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--使用this关键字
- javaSE_8系列博客——Java语言的特性(三)--类和对象(14)--初始化字段
- javaSE_8系列博客——Java语言的特性(三)--类和对象(21)--枚举类型
- javaSE_8系列博客——Java语言的特性(三)--类和对象(21)--何时使用Lambda 表达式?
- javaSE_8系列博客——Java语言的特性(三)--类和对象(16)--嵌套类(内部类的示例)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(6)--为你的类提供构造函数
- Rxjava的设计原理
- Apache 部署 Django 项目过程记录与问题总结
- falcon
- hdu 1010 dfs+奇偶剪枝
- 增加 weblogic 上下文根
- javaSE_8系列博客——Java语言的特性(三)--类和对象(13)--理解类的成员
- numpy.random.seed()和numpy.random.RandomState用法笔记
- Android 基础知识
- 转载的一份非常棒的Matplotlib 教程
- 说说C#的async和await
- SAP物料重要描述相关表
- JavaScript 读书笔记(基本语法)
- retorfit
- Semaphore的介绍和使用