Java编程入门(2.2):变量和基本类型

变量和基本类型

名字是编程的基础。在程序中,名字被用来指代许多不同种类的东西。若要使用这些东西,程序员必须理解命名规则,正确使用这些名字的规则。总而言之,程序员必须了解语法和名字的语义。

根据 Java 的语法规则,最基本的名字是标识符。标识符可以用于命名类、 变量和方法。标识符是一个或多个字符序列。它必须以字母或下划线开头,必须完全由字母、 数字和下划线组成。(“下划线”指的是字符’_'。)例如,这里是一些正确的标识符:N n rate x15 quite_a_long_name HelloWorld

标识符中不允许有空格 ;HelloWorld 是合法的标识符,但是”Hello World”不是。相同字母大小写是不同的意义,所以 HelloWorld、 helloworld、 HELLOWORLD 和 hElloWorLD 都是不同的名字。某些词语在 Java 中作为保留字,具有特殊用途,不能用作标识符。这些词语包括:class、 public、 static、 if、 else、 while 和其它几十个词。(记住保留字不是标识符,所以它们不能作为名字使用。)

Java 对于什么才算作字母或数字实际上相当自由的。Java 使用 Unicode 字符集,其中包括成千上万个字符,这些字符来自许多不同的语言和不同的字母表,许多字符被当作字母或数字。然而,实际输入的还是依赖于常规的英文键盘。

命名的语用学包括指导如何选择事物名字的风格。例如,为类(Class)命名习惯以大写字母开头,而变量和方法名以小写字母开头;在你自己的程序中按照这样的约定命名,可以避免很多不必要的麻烦。尽管有些类型的变量名是以下划线开头的,但是大多数 Java 程序员在名字中不使用下划线。当一个名称由多个词语组成,像 HelloWorld 或 interestRate,大家习惯第一个单词以外的每个单词首字母大写;这被称为驼峰式大小写,因为在名字中的大写字母看起来像一个骆驼背上的驼峰。

最后我要指出的是,除了简单的标示符外,在 Java 中有一些复杂的东西,我们可以用几个简单的词语组成复合词来表示,并由句点分隔开。(复合名也是合格的名字。)你已经见过这样一个例子了: System.out.println。这里的想法是, Java 中的某些事物能包含其它东西。复合名是一种路径,可以表示一层或多层包含关系。System.out.println 表示“System” 包含“out”,“out”又包含“println”。

2.2.1 变量

程序能操作存储在内存中的数据。在机器语言中,数据只是存储数据的内存地址。像 Java 一样的高级语言,名字代替地址以指代数据。跟踪数据实际存储在内存中的位置是计算机的工作。程序员只需要记住名字。使用这种方式 ——一个名字指向内存中数据,这就叫一个变量。

变量实际上是相当微妙的。严格地说,一个变量不是数据本身,而是内存中保存数据的位置。应该把一个变量看成一个容器或盒子,里面存放稍后需要使用的数据。变量直接指向盒子,间接的指向盒子中的数据。既然盒子中的数据能够改变,那么在程序执行期间,变量能够在不同的时间指向不同的数据值,但是始终指向同一个盒子。对于初学程序员,这可能会有些困惑,因为在程序中,以不同方式使用变量时会有所不同,有时候它指向容器,但换其它方式使用时,它指的是容器中的数据。下面你会看到这两种情况的例子

(在这种方式中,变量就像标题,举个例子——“美国总统”。这个标题在不同的时候可能指不同的人,但是总是指同一个官职。如果我说“总统正在打篮球”,我的意思是奥巴马在打篮球。但是如果我说“希拉里想当总统”,我的意思是她想竞选那个官职,而不是她想变成奥巴马。)

在 Java 中,只有一种方式将数据导入到变量中,那就是将数据放到该变量名的盒子中,即赋值语句。赋值语句就像下面这样:

variable = expression;

表达式可以指向任何值,或计算值。当计算机执行程序的过程中进行一个赋值语句操作,它会对表达式求值并将结果赋给变量。看看下面一个简单的赋值语句

rate = 0.07

此赋值语句中的变量是 rate,表达式的值是0.07。计算机执行此赋值语句就是将数值0.07放到变量 rate 中,不论 rate 之前存的是什么值都会被覆盖掉。现在,考虑下面更复杂的赋值语句,稍后可能会在同一个程序中出现:

interest = rate * principal;

“rate principal” 表达式的值被赋给了 interest 变量。在这个表达式中, 符号 是一个乘法算子,告诉计算机将 rate 和 principal 相乘。rate 和 principal 都是以自身含义所命名的变量,真正被乘的是存在变量中的值。当一个变量在表达式中使用,应该关注存在该变量中的值。 在这种情况下,变量似乎是指“盒子”中的数据,而不是“盒子”本身。当计算机执行这条赋值语句时,将 rate 的值乘以 principal 的值,然后将答案存放到 interest 指向的“盒子”中。当一个变量被用在赋值语句的左边,它指向该变量名的“盒子”。

(注意,顺便说一下,一条赋值语句是一个命令,在某个时间由计算机执行。这不是语句的全部(这句不太理智是什么意思)。例如,假设一个程序包含语句“rate = 0.07;”。如果“interest = rate * principal;”语句后来在程序中执行,我们能说 principal 乘以0.07么?当然不能!rate 的值可能同时被另外一个语句改变。虽然都是使用“=”符号,但赋值语句的含义和数学中的等式是完全不一样的。)

2.2.2 Types 类型

Java 中的变量被设计为仅保存一个特定类型的数据。它可以合法持有该类型的数据,其它类型则不行。如果你试图违反本规则,分配给一个变量错误类型的数据,编译器会认为这是一个语法错误。我们说Java是强类型语言,因为它强制执行此规则。

Java 中有8个内置的原始数据类型。这些类型为 byte、 short、int、long、float、double、char和 boolean。前四种类型保留整数(如17,-38477,0)。这四个整数类型由他们可以容纳的整数范围区分。浮点和双精度浮点类型可以保存实数(如3.6和-145.99)。其实,两个实数类型以范围和精度区分。char 类型的变量可以存放一个 Unicode 字符集中的字符。布尔类型的变量可以持有一个逻辑值 TRUE(真)或 FALSE(假)。

在计算机内存中的任何数据值,都必须以二进制数表示,即0和1的字符串。单个0或1被称为位(bit)。8个位的串被称为一个字节(byte)。内存中通常以字节为单位。毫不奇怪,byte 数据类型指的就是存储器的单个字节。byte 类型的变量可以存放一个8个位的字符串,它可以表示一个大于等于-128,小于等于127之间的整数。(该范围内总共有256个整数,8位能表示256,2个8次幂等不同的值。)其它的整数类型,

  • short 对应两个字节(16bits)。short 类型变量的值的范围是-32768至21767。
  • int 对应四个字节(32bits)。int 类型变量的值的范围是 -2147483648 至 2147483647。 -long 对应八个字节(64bits)。
  • long类型变量的值的范围是-9223372036854775808 至 9223372036854775807。

不必记住这些数字,但是大致的范围你需要了解。通常情况下,表示整数使用int类型就足够了。

float 类型占用存储器中4个字节,使用标准编码的实数。float 类型最大值为10的38次方,精确到小数点后7位。(32.3989231134和32.3989234399两者都可以存储在float类型中,不过要四舍五入至32.398923。) double类型占用8个字节,可以达到10的308次方,精确到小数点后15位。通常,你应该使用double类型来保存实际的值。

char 类型的变量在储存器中占2个字节。字符型变量的值可以是单个字符,如 A、*、x、或者一个空格。也可以是一个特殊的字符,如制表符(tab)或回车或来自不同语言的 Unicode 字符之一。char 类型的值和整数值是密切相关的,实际上一个字符是以一个16位的整数编号存储的。 事实上,在某些情况下 Java 中的字符被当成整数来使用。

要记住原始类型的值是有位数限制的。所以,一个 int 类型不能是任意整数,它只能是限定范围内的整数。同样,float 和 double 只能取一定范围内的值。它们不是数学意义上的真实数。例如,数学常数 π 只能使用 float 或 double 类型取近似值, 因为 π 有无限个小数位。类似的1/3也只能用 float 和 double 来近似的表示。

2.2.3 字面值

数据值以比特位(bit)序列存储在计算机中。在计算机内存中看起来不像是有任何价值的东西。在你写的程序中,你需要一种方法来包含一个常量值。程序中,你需要的常量值为文字。文字就是你在程序中输入的值。它只是一种常量的名称。

例如,在程序中输入一个 char 类型的值,你必须用一对单引号包括它,比如 ‘A’、’‘、’x'。字符和引号共同组成了一个 char 类型的值。没有引号的话,A 就成了一个标识符,也会被看作是一个乘号。引号不是值的一部分,也不会存在变量当中。只是命名一个特定的字符常量的约定。如果你想将字符 A 存储在 char 类型变量 ch 中,可以用赋值语句这样做

ch = 'A';

某些字符串中包含特殊字符时就必须使用“转义字符”,反斜杠“”。特别是像这样的,tab 表示 ‘t’,回车是 ‘r’,换行是 ‘n’,单引号是 ”,反斜杠就是它本身 ”。请注意,即使在 ‘t’ 引号内输入两个字符,这个值还是表示一个 tab 。

数值可能比你想象的要复杂。当然也有很简单的,像 317 和 17.42 这样的。但是在 Java 程序中也有其它的数值需要表示的。首先,实数可以用指数的形式表示,如 1.3e12 或 12.3737e-108。“e12” 和 “e-108” 表示 10 的幂,所以 1.3e12 表示 1.3 倍 10 的 12 次幂,12.3737e-108 表示 12.3737 倍 10 的 -108 次幂。这种格式可以用来表示非常大和非常小的数。任何包含小数点或者指数的数字值是 double 类型的。为了区分 float 类型的值,你必须要在数字值的后面追加一个“F”或“f”。例如,“1.2F”表示这是一个 float 类型的值。(因为 Java 规则就是这样规定的,你不能将一个 double 类型的值赋给一个 float 类型的变量,所以可能你会犯一个比较搞笑的错误,如果你写了一个这样的语句“x = 1.2;”,x 是 float 类型的,其实这是错误的。你必须这样写“x = 1.2f;”。这就是为什么我坚持推荐使用 double 类型来保存实数的原因了。)

即使是整型值,也有比较复杂的。普通的整数,如 177777 和 -32 可以是 byte 、 short 或 int 类型的值,这取决于它们的大小。你可以加上后缀“L”来声明一个 Long 类型的值。例如:17L 或 728476874368L。另一个复杂的问题是 Java 支持二进制、八进制、十六进制值。我不想详细的讲解有关进制数的东西,但万一在其它人的程序中碰到了进制数,你应该了解一些相关的知识。八进制数字只有 0 到 7。在 Java 中,以 0 开头的数字值被解释为八进制数;例如,八进制值 045 代表 37,不是数字 45 。八进制数很少使用,但必须要注意那些以0开头的数值。十六进制数字使用 16 位数字,数字 0 到 9 和字母 A、 B、 C、 D、 E 和 F。这种情况下,字母大小写是不敏感的。字母表示 10 到 15 的数字。在 Java 中,十六进制字符串以 0x 或 0X 开头,如 0×45 或 0xFF7A。最后,二进制数以 0b 或 0B 开头, 只能包含数字 0 和 1,例如: 0b10110。

最后一个麻烦, Java 7 的数值文本可以包含下划线 (“_”),可以用于分隔数字进行分组。例如,70 亿可以写成 7_000_000_000,这比 7000000000 好理解多了。没有关于多少位数必须分组的规则。下划线对于长二进制数也特别有用。例如,0b1010_1100_1011。

十六进制数字也可以用来表示任意的 Unicode 字符。一个 Unicode 字符可以由 u 跟着四个十六进制数字组成。例如, ‘u00E9′ 表示是带重音符的”e” Unicode 字符。

对于布尔(boolean)类型,只有两个值: true 和 false。直接输入这些词,不带引号,就像现在输入的那样,不过它们代表的是值,不是变量。布尔值常发生在条件表达式中。例如,

rate > 0.05

如果 rate 的值大于 0.05 那么表达式的结果为真(true),如果 rate 的值小于 0.05 那么结果为假(false)。你会看到第 3 章中,布尔值的表达式在控制结构中广泛使用。当然,布尔值也可以被赋值给布尔(boolean)类型的变量。例如, test 是一个布尔类型变量,下面的赋值语句都是正确的:

test = true;
test = rate > 0.05;

2.2.4 字符串和字符串文字

除了原始类型 Java 还有其它类型,但所有其它类型都是对象,而不是“原始”数据值。大多数情况下,我们不关心临时对象。然而有一个预定义的对象类型是非常重要的! String 类型。 (String 是一种类型,但不是原始类型; 事实上是类的名称,下一节我们会着重说说 String 类型。)

String类型的值是一个字符序列。你已经看到了一个字符串:“Hello World!”。双引号里面的就是了,它们在程序中输入。然而,它们并不是真正的字符串值,其中包括刚刚引号之间的一部分。一个字符串,可以包含任意数目的字符,甚至是零。没有内容的字符串被称为空字符串,由“”表示,一对双引号之间没有任何内容。记住单引号和双引号的区别单引号用于字符而双引号用于字符串!那就是字符串 “A” 和字符 ‘A’ 之间的巨大差异。

在字符串文本中,可以使用反斜杠符号表示特殊字符。在这里,双引号本身就是一个特殊字符。例如,若要表示的字符串值 I said, “Are you listening!” 而且以换行结尾,那就必须键入字符串:”I said, “Are you listening!”n” 你也可以使用 t、r和 u00E9 这样的 Unicode 序列来表示字符串中的其它特殊字符。

2.2.5 程序中的变量

程序中变量第一次使用才需要声明。变量声明语句用来声明一个或多个变量,并给它们起名字。当计算机执行变量声明时,它一边给该变量分配内存,并将内存与该变量名称关联起来。简单的变量声明形式:

type-name variable-name-or-names;类型名称 变量名或名称;

variable-name-or-names(变量名或名称)可以是单个变量名或以逗号分隔的变量名的列表。(稍后我们会看到比这更复杂一些的变量声明语句。)良好的编程风格是在声明语句中只写一个变量,除非变量之间有某种关系。例如:

int numberOfStudents;
String name;
double x, y;        
boolean isFinished;
char firstInitial, middleInitial, lastInitial;

在每个变量声明后说明在程序中的目的,或者提供一些其它信息给后面有可能需要阅读这些代码的人,这也是良好的编程风格。例如:

double principal;    // Amount of money invested.
double interestRate; // Rate as a decimal, not percentage.

在本章中,我们只在程序的 main() 方法中声明变量。方法内声明的变量称为该方法的局部变量。它们只存在方法中,当它在运行时,外部无法访问。 变量声明可以在方法中的任何地方,不过要在使用之前声明。有些人喜欢在方法的开头声明所有变量。有些人就在需要的时候才声明。我的建议:将所有重要的变量在开头声明,并使用注释,说明每个变量的目的。对于程序整体逻辑来说不重要的“临时变量 ”,推荐在第一次使用的地方声明它们。下面是一个简单的程序示例,使用了一些变量和赋值语句:

/**
 * This class implements a simple program that
 * will compute the amount of interest that is
 * earned on $17,000 invested at an interest
 * rate of 0.027 for one year.  The interest and
 * the value of the investment after one year are
 * printed to standard output.
 */

public class Interest {

   public static void main(String[] args) {

       /* Declare the variables. */

       double principal;     // The value of the investment.
       double rate;          // The annual interest rate.
       double interest;      // Interest earned in one year.

       /* Do the computations. */

       principal = 17000;
       rate = 0.027;
       interest = principal * rate;   // Compute the interest.

       principal = principal + interest;
             // Compute value of investment after one year, with interest.
             // (Note: The new value replaces the old value of principal.)

       /* Output the results. */

       System.out.print("The interest earned is $");
       System.out.println(interest);
       System.out.print("The value of the investment after one year is $");
       System.out.println(principal);

   } // end of main()

} // end of class Interest

这个程序调用了几个方法向程序的用户显示信息。使用了两个不同的方法:System.out.print 和 System.out.println。之间的区别是 System.out.println 在显示的信息后面增加了换行,而 System.out.print 则没有。因此在同一行显示字符串是调用 System.out.print 语句, interest 的值是由 “System.out.println(interest);” 这一句显示的。需要注意的是由 System.out.print 或 System.out.println 显示的值是由方法名后的括号中提供的。这个值被称为方法的参数。参数提供方法执行其任务所需的信息。在调用方法时,所有参数都列在方法名后括号内。如果在一个方法没有参数,方法名后面必须跟一对空括号。

这本书上所有的示例程序在 http://math.hws.edu/javanotes/source 上都能找到源代码。在该网站的下载文档中也有,在 source 文件夹中。例如, Interest 程序的源代码,可以在 source 文件夹 chapter2 子文件夹中找到 Interest.java 文件。

原文链接: math.hws.edu 翻译: ImportNew.com - 光光头去打酱油
译文链接: http://www.importnew.com/16981.html
[ 转载请保留原文出处、译者和译文链接。]



相关文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部