Java™ 教程(变量)

变量

正如你在上一课中所了解到的,对象将其状态存储在字段中。

int cadence = 0; int speed = 0; int gear = 1;

什么是对象?”讨论向你介绍了字段,但你可能还有一些问题,例如:命名字段的规则和约定是什么?除了int之外,还有哪些其他数据类型?在声明字段时是否必须初始化字段?如果未明确初始化字段,是否为字段分配了默认值?我们将在本课中探讨这些问题的答案,但在我们开始之前,你必须首先了解一些技术差异。在Java编程语言中,使用术语“字段”和“变量”,这是新开发人员之间混淆的常见原因,因为两者往往都是指同一件事。

Java编程语言定义了以下几种变量:

  • 实例变量(非静态字段):从技术上讲,对象将它们各自的状态存储在“非静态字段”中,即,在没有static关键字的情况下声明的字段,非静态字段也称为实例变量,因为它们的值对于类的每个实例都是唯一的(换句话说,对于每个对象),一辆自行车的当前速度独立于另一辆自行车的当前速度。
  • 类变量(静态字段):类变量是使用static修饰符声明的任何字段,这告诉编译器这个变量只有一个副本存在,无论该类被实例化多少次,定义特定类型自行车档位数的字段可以标记为静态,因为从概念上讲,相同数量的档位将适用于所有实例,代码static int numGears = 6会创建这样一个静态字段。此外,可以添加关键字final以指示档位的数量永远不会改变。
  • 局部变量:与对象如何在字段中存储其状态类似,方法通常将其临时状态存储在局部变量中,声明局部变量的语法类似于声明字段(例如,int count = 0;)。没有特殊关键字将变量指定为本地变量,该决定完全来自声明变量的位置 - 它位于方法的开括号和右括号之间。因此,局部变量仅对声明它们的方法可见,他们无法从类的其他其他访问。
  • 参数:你已经在Bicycle类和“Hello World”应用程序的main方法中看到了参数示例,回想一下main方法的签名是public static void main (String [] args),这里,args变量是此方法的参数。要记住的重要一点是参数总是被归类为“变量”而不是“字段”,这也适用于其他参数接受构造(例如构造函数和异常处理程序),你将在本教程后面学习。

命名

每种编程语言都有自己的规则和约定,适用于你可以使用的各种名称,Java编程语言也不例外,命名变量的规则和约定可归纳如下:

  • 变量名称区分大小写,变量的名称可以是任何合法标识符 - 一个无限长度的Unicode字母和数字序列,以字母开、美元符号“$”或下划线字符“_”开头,但是,惯例是始终用字母开始变量名,而不是“$”或“_”,此外,按照惯例,美元符号字符根本不会被使用。你可能会发现某些情况,其中自动生成的名称将包含美元符号,但你的变量名称应始终避免使用它,对于下划线字符存在类似的约定;虽然用“_”开始变量的名称在技术上是合法的,但不鼓励这种做法,不允许有空格。
  • 后续字符可以是字母,数字,美元符号或下划线字符,约定(和通用场景)也适用于此规则,为变量选择名称时,请使用完整单词而不是隐藏缩写,这样做可以使你的代码更易于阅读和理解。在许多情况下,它还会使你的代码自我记录,例如,名为cadencespeedgear的字段比缩写版本(如scg)更直观,另请注意,你选择的名称不得是关键字或保留字。
  • 如果你选择的名称只包含一个单词,则拼写全部小写字母,如果它由多个单词组成,则将每个后续单词的首字母大写,名称gearRatiocurrentGear是此约定的主要示例,如果你的变量存储一个常量值,例如static final int NUM_GEARS = 6;,约定略有变化,大写每个字母并用后下划线分隔后续单词,按照惯例,下划线字符从未在别处使用过。

原始数据类型

Java编程语言是静态类型的,这意味着必须首先声明所有变量才能使用它们,这包括声明变量的类型和名称,如你所见:

int gear = 1;

这样做会告诉程序一个名为“gear”的字段存在,保存数字数据,初始值为“1”,变量的数据类型确定它可能包含的值,以及可能对其执行的操作。除了int之外,Java编程语言还支持其他七种原始数据类型,基本类型由语言预定义,并由保留关键字命名,原始值不与其他原始值共享状态,Java编程语言支持的八种原始数据类型是:

  • byte:字节数据类型是8位带符号的二进制补码整数,它的最小值为-128,最大值为127(含),字节数据类型可用于在大数组中保存内存,其中节省的内存实际上很重要。它们也可以用于代替int,其限制有助于澄清你的代码,变量范围有限的事实可以作为一种文档形式。
  • shortshort数据类型是16位带符号的二进制补码整数,它的最小值为-32,768,最大值为32,767(含)。与字节一样,适用相同的准则:在内存节省实际上很重要的情况下,你可以使用short来节省大数组中的内存。
  • int:默认情况下,int数据类型是32位带符号的二进制补码整数,其最小值为-2^31,最大值为2^31-1,在Java SE 8及更高版本中,你可以使用int数据类型来表示无符号的32位整数,其最小值为0,最大值为2^32-1,使用Integer类将int数据类型用作无符号整数,有关详细信息,请参阅“Number类”一节。已经将诸如compareUnsigneddivideUnsigned等静态方法添加到Integer类中,以支持无符号整数的算术运算。
  • longlong数据类型是64位二进制补码整数,带符号的long的最小值为-2^63,最大值为2^63-1,在Java SE 8及更高版本中,你可以使用long数据类型来表示无符号的64位长,其最小值为0,最大值为2^64-1,当需要比int提供的值更宽的值时,请使用此数据类型,Long类还包含compareUnsigneddivideUnsigned等方法,以支持无符号long的算术运算。
  • float:浮点数据类型是单精度32位IEEE 754浮点,它的值范围超出了本讨论的范围,但在Java语言规范的浮点类型、格式和值部分中指定。与byteshort的建议一样,如果需要在大型浮点数数组中保存内存,请使用float(而不是double),绝不应将此数据类型用于精确值,例如货币,为此,你需要使用java.math.BigDecimal类,Numbers和Strings涵盖了Java平台提供的BigDecimal和其他有用的类。
  • doubledouble数据类型是双精度64位IEEE 754浮点,它的值范围超出了本讨论的范围,但在Java语言规范的浮点类型、格式和值部分中指定,对于十进制值,此数据类型通常是默认选择,如上所述,此数据类型不应用于精确值,例如货币。
  • boolean:布尔数据类型只有两个可能的值:truefalse,将此数据类型用于跟踪真/假条件的简单标志,此数据类型表示一位信息,但其“大小”不是精确定义的内容。
  • charchar数据类型是单个16位Unicode字符,它的最小值为'u0000'(或0),最大值为'uffff'(或65,535(含))。

除了上面列出的八种原始数据类型之外,Java编程语言还通过java.lang.String类为字符串提供特殊支持,将字符串括在双引号内将自动创建一个新的String对象,例如,String s =“this is a string”;。字符串对象是不可变的,这意味着一旦创建,它们的值就不能更改,String类在技术上不是原始数据类型,但考虑到语言给予它的特殊支持,你可能倾向于认为它是这样的,你将在简单的数据对象中了解有关String类的更多信息。

默认值

声明字段时并不总是需要分配值,声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型,然而,依赖于这样的默认值通常被认为是糟糕的编程风格。

下表总结了上述数据类型的默认值。

数据类型 默认值(对于字段)
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char 'u0000'
String(或任何对象) null
boolean false

局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值,如果无法初始化声明它的局部变量,请确保在尝试使用它之前为其赋值,访问未初始化的局部变量将导致编译时错误。

字面值

你可能已经注意到在初始化基本类型的变量时不使用new关键字,原始类型是语言中内置的特殊数据类型,它们不是从类创建的对象。字面值是固定值的源代码表示,字面值直接在代码中表示,无需计算,如下所示,可以将字面值分配给基本类型的变量:

boolean result = true; char capitalC = 'C'; byte b = 100; short s = 10000; int i = 100000;

整数字面值

如果整数字面值以字母Ll结尾,则其长度为long,否则它是int类型,建议你使用大写字母L,因为小写字母l很难与数字1区分开来。

可以从int字面值创建整数类型byteshortintlong的值,可以从long字面值创建超出int范围的long类型的值,整数字面值可以用这些数字系统表示:

  • 十进制:基数10,其数字由数字0到9组成,这是你每天使用的数字系统。
  • 十六进制:基数16,其数字由数字0到9和字母A到F组成。
  • 二进制:基数2,其数字由数字0和1组成(你可以在Java SE 7及更高版本中创建二进制字面值)。

对于通用编程,十进制系统可能是你将使用的唯一数字系统,但是,如果需要使用其他数字系统,以下示例将显示正确的语法,前缀0x表示十六进制,0b表示二进制:

// The number 26, in decimal int decVal = 26; //  The number 26, in hexadecimal int hexVal = 0x1a; // The number 26, in binary int binVal = 0b11010;

浮点字面值

如果浮点字面值以字母Ff结尾,则浮点字面值为float类型,否则它的类型是double的,它可以选择以字母Dd结尾。

浮点类型(floatdouble)也可以用Ee(科学计数法),Ff(32位浮点数)和Dd(64位双精度数,这是默认值,按惯例省略)表示。

double d1 = 123.4; // same value as d1, but in scientific notation double d2 = 1.234e2; float f1  = 123.4f;

字符和字符串字面值

类型charString的字面值可以包含任何Unicode(UTF-16)字符,如果你的编辑器和文件系统允许,你可以直接在代码中使用这些字符,如果没有,你可以使用“Unicode转义”,例如'u0108'(带有circumflex的大写字母C),或"Su00ED Seu00F1or"(SíSeñor,西班牙语)。始终对char字面值使用“单引号”,对字符串字面值使用“双引号”,Unicode转义序列可以在程序的其他地方使用(例如在字段名中),而不仅仅是在charString字面值中。

Java编程语言还支持charString字面值的一些特殊转义序列:b(退格)、t(制表符)、n(换行)、f(换页)、r(回车)、 "(双引号)、'(单引号)和\(反斜杠)。

脚本宝典为你提供优质服务
脚本宝典 » Java™ 教程(变量)

发表评论

提供最优质的资源集合

立即查看 了解详情