您的位置:首页 > 编程语言 > Java开发

JAVA基础之二:变量和数据类型

2016-04-14 19:18 633 查看
原文链接:http://happyshome.cn/blog/java/basics/variable.html





本文主要介绍了Java中基本的数据类型,以及如何在程序中正确的使用。


1. 变量

计算机处理数据,变量被用来存储处理的数据,之所以叫做变量因为你可以改变存储的值。更确切的说,一个变量指向着一块存储特定类型值的地址,换句话说,一个变量有名称、类型和值。一个变量有一个名称,例如radius、area、age和height,每个变量的名称都是唯一的,这边可以方便我们设置和获取变量的值。
一个变量有一种类型,下面是Java类型的列子:

int: 表示整数例如123和-456
double: 表示浮点数例如3.1416、-55.66、1.2e3和-4.5E-6
String: 表示文本例如"Hello"、"Good Morning!",文本通常嵌入在双引号里面
char: 表示单个字符例如'a','8',单个字符通常嵌入在单引号里面。

变量存储特定类型的值,编程中要特别注意变量类型,举例:一个int变量存储整数123,但是不能存储浮点数12.34,同样也不能存储文本"Hello"。

早期的编程语言中引入了类型的概念来解释二进制01数据,类型定义了数据的结构、大小、范围以及针对该类型的一系列操作。




2. 名称

需要唯一的标识来命名变量,Java遵循以下标识的命名方式:

标识由大小写字母、数字、下划线和$的任意长度的字符序列组成。
空白 (空格、制表符、换行符)和其他特殊字符 (如+ - * / @ &, 等)是不允许的,错误的命名方式:max value和max-value。
标识符不能以数字(0-9)开头必须以字母(a-z, A-Z)、下划线(_)和$开头,系统保留以$开头的标识。
标识符不能使用关键字和预留字段 (例如:class,int,double,if,else,for,true,false,null)。
标识符是区分大小写的,rose、Rose和ROSE是3个不同的变量。

使用驼峰给变量命名:theFontSize、roomNumber、xMax、yMin、xTopLeft和thisIsAVeryLongVariableName, 可以参考下面的建议:

选择一个有意义的变量名是非常重要的,建议使用numberOfStudents和numStudents来表示学生人数,而不是n或x。
这些变量名a, b, c, d, i, j, k, i1, j99毫无意义
x通常用作异常,y、z用来表示坐标,i表示循环索引。
对单复数变量加以区分,row表示单行,rows表示多行。


3. 定义变量

你需要定义变量的名称和类型才能在程序中使用变量,你可以使用下面的其中一种语法:
// 定义特定类型的变量, type identifier
int option;

// 定义多个同类型变量,变量之间用逗号分隔,type identifier1, identifier2, ..., identifierN
double sum, difference, product, quotient;

// 定义变量并初始化, type identifier = initialValue
int magicNumber = 88;

// 定义多个同类型变量并初始化, type identifier1 = initValue1, ..., identifierN = initValueN
String greetingMsg = "Hi!", quitMsg = "Bye!";

注意:

Java是强类型的语言,一个变量对应着一种类型,变量声明后不能存储其它类型的数据。
每个变量只能声明一次。
使用前你可以在程序的任意位置进行声明。
变量声明之后它的类型不能更改。
一个变量声明的语句以类型开始,变量自始自终都为这种类型服务,一个变量声明的语句只能使用单一的类型。


4. 常量

常量的命名规范:使用大写的单词,多个单词使用下划线连接,例如:MIN_VALUE,MAX_SIZE。

常量是不可变的,使用关键字final进行声明,常量声明后需要初始化
final double PI = 3.1415926;
[/code]


5. 表达式

表达式是由运算符和操作数组合而成,通过计算可以输出单个类型的值,例如
1 + 2 * 3                        // 计算得到7

int sum, number;
sum + number                     // 计算得到一个int值

double principal, interestRate;
principal * (1 + interestRate)   // 计算得到一个double值

[/code]


6. 赋值

指派一个右操作数赋值给左操作数,例如:x=1。

计算表达式的值并赋值给左操作数,例如:x=(y + z) / 2。
赋值语句的语法:
// 直接赋值, variable = literalValue
number = 88;

// 计算表达式之后赋值, variable = expression
number = number + 1;  // 计算表达式number+1,最后将结果赋值给number

8 = number;           // 错误的使用
number + 1 = sum;     // 错误的使用

[/code]


7. 基本类型

在Java中有两种类型:基本类型 (int、double等)和引用类型 (类和数组)。

byte: 8位有符号整型取值范围:[-2^7, 2^7-1] = [-128, 127]。
short: 16位有符号整型取值范围:[-2^15, 2^15-1] = [-32768, 32767]。
int: 32位有符号整型取值范围:[-2^31, 2^31-1] = [-2147483648, 2147483647] (≈9 digits)。
long: 64位有符号整型取值范围:[-2^63, 2^63-1] = [-9223372036854775808, +9223372036854775807] (≈19 digits)。
float: 32位单精度浮点数(≈6-7位小数, 取值范围:±[≈10^-45, ≈10^38])。
double: 64位双精度浮点数(≈精确到14-15位小树, 取值范围:±[≈10^-324, ≈10^308])。
char: 表示16位Unicode编码,取值范围:'\u0000' 到 '\uFFFF', 可以理解成16位无符号整型,取值范围:[0, 65535]。
boolean: 布尔取值只能是true或false,布尔数据类型的大小在Java虽然没有定义, 但是至少需要1比特。

内建的基本类型



基本类型内建在程序语言中,从上面的图中我们可以看出Java有8种基本类型。

有4种有符号的整型:8位byte,16位short,32位int,64位long。
32位单精度类型float,float近似的取值范围±1.40239846×10^-45到±3.40282347×10^38。
64位双精度类型double, double近似的取值范围±4.94065645841246544×10^-324到±1.79769313486231570×10^308。
char表示单个字符,例如'0', 'A', 'a',在Java中,char采用16位Unicode(UCS-2格式)来支持国际化(i18n)。
Java中引入了二进制的布尔类型,它只能包含true和false两个值。

例子:下面的程序用来输出打印基本类型的最大值、最小值和比特长度。
/*
* 输出基本类型的最大值、最小值和比特长度
*/
public class PrimitiveTypesMinMax {
public static void main(String[] args) {
// int (32位有符号整型)
System.out.println("int(min) = " + Integer.MIN_VALUE);
System.out.println("int(max) = " + Integer.MAX_VALUE);
System.out.println("int(bit-length) = " + Integer.SIZE);
// byte (8位有符号整型)
System.out.println("byte(min) = " + Byte.MIN_VALUE);
System.out.println("byte(max) = " + Byte.MAX_VALUE);
System.out.println("byte(bit-length)=" + Byte.SIZE);
// short (16位有符号整型)
System.out.println("short(min) = " + Short.MIN_VALUE);
System.out.println("short(max) = " + Short.MAX_VALUE);
System.out.println("short(bit-length) = " + Short.SIZE);
// long (64位有符号整型)
System.out.println("long(min) = " + Long.MIN_VALUE);
System.out.println("long(max) = " + Long.MAX_VALUE);
System.out.println("long(bit-length) = " + Long.SIZE);
// char (16位字符或者16位无符号整型)
System.out.println("char(min) = " + (int)Character.MIN_VALUE);
System.out.println("char(max) = " + (int)Character.MAX_VALUE);
System.out.println("char(bit-length) = " + Character.SIZE);
// float (32位浮点数)
System.out.println("float(min) = " + Float.MIN_VALUE);
System.out.println("float(max) = " + Float.MAX_VALUE);
System.out.println("float(bit-length) = " + Float.SIZE);
// double (64位浮点数)
System.out.println("double(min) = " + Double.MIN_VALUE);
System.out.println("double(max) = " + Double.MAX_VALUE);
System.out.println("double(bit-length) = " + Double.SIZE);
}
}

int(min) = -2147483648
int(max) = 2147483647
int(bit-length) = 32

byte(min) = -128
byte(max) = 127
byte(bit-length)=8

short(min) = -32768
short(max) = 32767
short(bit-length) = 16

long(min) = -9223372036854775808
long(max) = 9223372036854775807
long(bit-length) = 64

char(min) = 0
char(max) = 65535
char(bit-length) = 16

float(min) = 1.4E-45
float(max) = 3.4028235E38
float(bit-length) = 32

double(min) = 4.9E-324
double(max) = 1.7976931348623157E308
double(bit-length) = 64

[/code]


String

String不是基本类型,是另外一种常用的类型,它表示文本内容,在Java中字符串使用双引号。
String message = "Hello, world!"; // 字符串使用双引号
char gender = 'm';                // 字符使用单引号

[/code]
为变量选择数据类型
开发中需要设计合适的变量类型,多数时我们不难选择,你可以用int来存储整型,用float来存储有小数的数值,用String来存储文本,用char来存储单个字符和用boolean来存储二元结果。
经验法则

由于int类型非常精确、运行效率高,因此常被用作计数和索引。
尽可能的使用int类型。

数据表示
值得注意的是char '1'与int 1、byte 1、short 1、float 1.0、double 1.0、String "1"是不相同的,它们在计算机的内存中有着不同的精度和说明,举例说明:

byte 1表示00000001
short 1表示00000000 00000001
int 1表示00000000 00000000 00000000 00000001
long 1表示00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
float 1.0表示0 01111111 0000000 00000000 00000000
double 1.0表示0 01111111111 0000 00000000 00000000 00000000 00000000 00000000 00000000
char '1'表示00000000 00110001
String "1"表示复杂的对象

下面我们来看一个变量名称和类型的例子:

Paul买了一台abc品牌的笔记本电脑,3.2GHZ高速处理器、4GB内存、500GB硬盘、15英寸显示器,总价为$1650.45,在现场从服务计划A、B、C中选择了B计划,定义涉及的相关变量和类型。
String name = "Paul";
String brand = "abc";
double processorSpeedInGHz = 3.2;  // 或者 float
double ramSizeInGB = 4;            // 或者 float
int harddiskSizeInGB = 500;        // 或者 short
int monitorInInch = 15;            // 或者 byte
double price = 1650.45;
char servicePlan = 'B';
boolean onSiteService = true;

[/code]


练习:

假设你正在为学校开发一款收集学生信息的软件,学生的信息包括年龄、地址、电话、性别、生日、身高、体重、年级、入学时间等,每个学生被分配一个8位数字标识,下面来使用变量定义它们吧。


8. 用于基本类型和String类型的字面值

编程中使用的文字、字面值都是特定的常量,例如123,-456,3.14,-1.2e3,'a',"Hello", 可以用做赋值或表达式。
Integer(int,long,short,byte)字面值
// 整数默认的都被视作int类型,例如123和-456,在Java中32位的int取值范围从-2,147,483,628(-2^31)到2,147,483,627(2^31-1)
int number = -123;
int sum = 1234567890;            // 这个值在int取值范围内
int bigSum = 8234567890;         // 错误: 这个值超出了int取值范围

// int字面值没有特殊说明都表示10进制,以0开头的数字表示8进制,以'0x'开头的数字表示16进制。
int number = 1234;               // 10进制1234
int number = 01234;              // 8进制1234, 10进制668
int number = 0x1abc;             // 16进制1ABC, 10进制6844

// 从JDK1.7开始,你可以使用'0b'或者'0B'为前缀来表示二进制,你也可以使用下划线_对数字进行分组来提高可读性,但是开头和结尾必须使用数字。
int number1 = 0b01010000101000101101000010100010;
int number2 = 0b0101_0000_1010_0010_1101_0000_1010_0010;
int number3 = 2_123_456;

// long字面值用数字加上后缀'L'或'l'来表示
long bigNumber = 1234567890123L;
long sum = 123;                   // int类型123会被自动转换成long类型123L

// byte和short字面值不需要添加后缀,你可以直接使用整数初始化
byte smallNumber = 12345;         // 错误: 超出了byte取值范围
byte smallNumber = 123;
short midSizeNumber = -12345;

// 有小数点的数值例如55.66和-33.44默认的被视作double类型,同样你可以用科学计数法表示,例如1.2e3, -5.5E-6, 大写E小写e表示10的指数,你可以用数字加上后缀'd'或'D'表示。
float average = 55.66;            // 错误! 右操作是double类型, 需要后缀'f'来表示
float average = 55.66f;

[/code]
字符字面值和转义序列
// 字符嵌入在单引号里面表示char类型,char类型使用16位的Unicode编码,算术运算上等同于16位无符号整型
char letter = 'a';                 // 等同于97
char anotherLetter = 98;           // 等同于'b'
System.out.println(letter);        // 输出'a'
System.out.println(anotherLetter); // 输出'b'代替数字
anotherLetter += 2;                // 100或'd'
System.out.println(anotherLetter); // 输出'd'

[/code]
非打印的控制字符通常被称为转义序列,通常以反斜线\开始,下面是常用的转义序列:

换行符: \n等同于000AH (10D)
回车符: \r等同于000DH (13D)
制表符: \t等同于0009H (9D)
双引号: \"等同于0022H (34D)
单引号: \'等同于0027H (39D)
反斜线: \\等同于005CH (92D)

说明:

用转义序列\n和\r分别表示换行符(000AH)和回车符(000DH),值得注意的是在Unix和Mac中使用\n(0AH)表示换行,而Windows使用\r\n(0D0AH)表示。
用转义序列\t表示制表符(0009H)。
为了解决歧义,反斜线(\),单引号('),双引号("),分别用转义序列\\,\'和\"来表示。
其它不太常用的转义序列: \a警报, \b退格, \f换页, \v垂直标签,某些控制台可能无法支持。

String字面值
长度不定的字符串嵌入在双引号里面表示字符串字面值,例如"Hello, world!","The sum is: ",举例说明:
String directionMsg = "Turn Right";
String greetingMsg = "Hello";
String statusMsg = "";   // 空字符串

// 字符串字面值可能包含转义序列,在字符串你里面,你需要使用 \"来表示双引号,单引号不需要转义,举例说明:
System.out.println("Use \\\" to place\n a \" within\ta\tstring");

Use \" to place
a " within	a	string

[/code]
练习:编写程序打印输出下面的字符。
[code]'__'
(oo)
+========\/
/ || %%% ||
*  ||-----||
""     ""

[/code]
boolean字面值
// boolean字面值紧包含两个值:true和false
boolean done = true;
boolean gameOver = false;

[/code]
字面值的例子
public class LiteralTest {
public static void main(String[] args) {
String name = "Tan Ah Teck"; // String使用双引号
char gender = 'm';           // char使用单引号
boolean isMarried = true;    // true或者false
byte numChildren = 8;        // byte取值范围[-127, 128]
short yearOfBirth = 1945;    // short取值范围[-32767, 32768]
int salary = 88000;
long netAsset = 8234567890L;
double weight = 88.88;
float gpa = 3.88f;

// 输出
System.out.println("Name is " + name);
System.out.println("Gender is " + gender);
System.out.println("Is married is " + isMarried);
System.out.println("Number of children is " + numChildren);
System.out.println("Year of birth is " + yearOfBirth);
System.out.println("Salary is " + salary);
System.out.println("Net Asset is " + netAsset);
System.out.println("Weight is " + weight);
System.out.println("GPA is " + gpa);
}
}

Name is Tan Ah Teck
Gender is m
Is married is true
Number of children is 8
Year of birth is 1945
Salary is 88000
Net Asset is 1234567890
Weight is 88.88
Height is 188.8

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: