1.2.1 变量variable (youtube视频:变量)
Java中的变量分为原始变量(primitive variables) 和 引用变量(reference variables)。
原始变量是保存(原始类型)数据(值)的内存块的名字,你可以认为原始变量就是这块内存块。如:
int age = 20;
这个代码语句定义了一个名字叫age的变量,其数据类型是int,int是一个整数(integer)数据类型。age变量的初始值是20。
定义变量时可以不给它初始值,随后可以用单独的赋值运算符= 给它一个值。例如,
int age;
age = 20;
注意:Java 是一种静态类型的语言。这意味着所有变量都必须在使用之前声明,即声明一个变量的数据类型。如上面声明的age变量的数据类型是int。
引用变量保存的是java的类的对象(objects) 的引用。这个引用类似于C/C++语言中的指针,即引用变量引用一个类的对象,但不是这个对象本身。
String是java中表示字符串的类,下面代码定义了一个引用变量s,表示s引用一个String类的对象,这个对象的值是字符串”Hello, World!”。
String s = "Hello, World!";
虽然,我们习惯说s的值是”Hello, World!”,但严格来说,这是不正确的。s的实际值是String类对象的一个引用(指针)而不是”Hello, World!”。但这个对象中的值是”Hello, World!”。
因此:原始变量的信息存储为该变量的值,而引用变量保存其引用对象的引用。
再看一下这个代码:
int problems = 99;
String name = "Jay-Z";
原始类型int的变量problems和类对象的引用变量name,其内存布局示意图如下:
修改变量的值
可以用用赋值运算符= 修改一个变量的值,
int age = 20; //age初始值是20
age = 22; //修改age值为22
单一定义原则
在同一个作用域里不能定义两个同名的变量。作用域今后会讨论,这里可以简单理解为左右花括号{和}包围的一个程序块。如:
int age = 16;
int age; //错:重定义
或者
int value;
float value = 25.4; //错:重定义
这里的float是浮点类型(表示一个实数)。
变量名的定义规则
变量的名称可以是任何合法的标识符: 一个任意长的 Unicode字母和数字序列。定义变量名有下面一些规则:
- 变量必须以字母或下划线
_
或美元符$
开头。例如:int age; // 合法良好的名字 int _age; // 合法但不好 int $age; // 合法但不好
- 后续字符可以是字母、数字、美元符号或下划线字符。
int NUM_GEARS = 6
- 变量名不能以数字开头。例如:
int 3age; // 不合法
- 变量名不能使用空格。例如,
float test score ; // 不合法
- Java 区分大小写。因此,age和 AGE 是两个不同的变量。例如:
int age = 20;
int AGE = 22;
System.out.println(age); // prints 20
System.out.println(AGE); // prints 22
- 创建变量时,选择一个有意义的名称。例如,score、name、age 比 s、n 和 a 等变量名更有意义。
- 有时可以用多个单词表示一个变量,除第一个单词外,其他单词的首字母通常大写,如myScore、serverSocket。
根据变量的作用范围,变量还分为:Instance Variables (Non-Static Fields)(实例变量或非静态变量)、Class Variables (Static Fields) (类变量或静态变量)、Local Variables(局部变量)、Parameters(参数)。 如下面的main()方法内定义的都是局部变量,而args是main()方法的参数。参数本质上也是局部变量。
class MyClass {
public static void main(String[] args) {
double myDouble = 3.4;
float myFloat = 3.4F;
// 3.445*10^2
double myDoubleScientific = 3.445e2;
System.out.println(myDouble); // prints 3.4
System.out.println(myFloat); // prints 3.4
System.out.println(myDoubleScientific); // prints 344.5
}
}
1.2.2 数据类型(Data Types)、原始类型(Primitive Data Types) (youtube视频:原始数据类型)
Java是一个静态类型语言,任何变量的定义都必须说明其数据类型。Java的数据类型(Data Types)分为原始类型(Primitive Data Types) 和 类(class) 类型。如String是一个表示字符串的类类型,而int是表示整数的原始类型。
本节介绍原始数据类型,Java一共有8种原始数据类型:byte、short、int、long、float、double、boolean 和 char。不同数据类型占据内存的大小不一样,表示的值及其范围也不一样。
如下面main()方法中的不同类型的变量:
class TestDataType{
public static void main(String[] args) {
String name = "hwdong.net"; // String类型
byte age = 5; // byte类型
short schoolStudentNum = 16913; // short短整型
int collegeStudentNum = 36913 ; // int整型
long atomicNum = 12345678910L; // long长整型
float height = 172.5f; // 单精度浮点数类型
double profit = 234.5d; // 双精度浮点数类型
boolean passed = true; // 布尔类型
char grade = 'B'; // 字符类型
char ch = '\u0051';
System.out.println(name); // 打印 hwdong.net
System.out.println(age); // 打印 5
//...
System.out.println(grade); // 打印 B
System.out.println(ch); // 打印 Q
}
}
8个原始类型
-
boolean 类型 boolean(布尔)数据类型有两个可能的值,true 或 false。boolean类型变量如果没有初始化,其默认值是false。boolean类型变量通过用来表示某个条件的真假(true/false)。
-
byte 类型: byte(字节)数据类型的值可以从 -128 到 127(8 位有符号二进制补码整数)。如果确定一个变量的值在-128到127之间,那么就用它代替int来节省内存。byte类型变量的默认值是0。
-
short 类型: short(短整型) 数据类型的值可以从 -32768 到 32767(16 位有符号二进制补码整数)。如果确定变量的值将在 -32768 和 32767 之间,则使用它代替其他整数数据类型(int、long)以便节省内存。
-
int 类型: int(整型)数据类型可以取值从$-2^{31}$到$-2^{31}-$(32位有符号二进制补码整数)。默认值是:0。
-
long 类型: long(长整型)数据类型的值可以从$-2^{63}$ 到 $-2^{63}-1$ (64 位有符号二进制补码整数)。默认值是:0。
-
double 类型: double双精度数据类型是双精度 64 位浮点数。
-
float 类型: float 数据类型是单精度 32 位浮点数。
-
char 类型: char(字符类型)表示一个 16 位 Unicode字符。char数据类型的最小值为’\u0000’ (0),最大值为’\uffff’。默认值: ‘\u0000’。 字符’\u0000’并不是表示字符’0’,字符’0’的Unicode字符的值并不等于0。
下表总结了java的基本类型数据占用内存大小、取值情况和默认值。
数据类型 | 内存大小 | 取值 | 默认值 |
---|---|---|---|
byte | 1个字节 | -128到127之间的整数 | 0 |
short | 2个字节 | -32,768到32,767之间的整数 | 0 |
int | 4个字节 | -2,147,483,648 到2,147,483,647之间的整数 | 0 |
long | 8个字节 | -9,223,372,036,854,775,808到9,223,372,036,854,775,807之间的整数 | 0 |
float | 4个字节 | 单精度32位 IEEE 754 浮点数 ,小数位可达7位 | 0.0f |
double | 8个字节 | 双精度 64 位 IEEE 754 浮点数,小数位可达15位 | 0.0d |
boolean | 1个字节 | 只有2个值:true和false | false |
char | 2个字节 | 表示单个字符 | ‘\u0000’ |
1.2.3 文字量 literals
文字量是用于表示固定值的数据。它们可以直接在代码中使用。例如,
int age = 20;
float score = 80.5;
代码中的20、80.5都是文字量。
1. Boolean(布尔)文字量: 用于初始化布尔数据类型。它们只有两个值:true 和 false。
2. Integer(整数)文字量: 整型文字量是没有任何小数或指数部分的数字文字量,用于表示一个整数值。整型文字量可以表示为不同进制(二进制、八进制、十进制、十六进制)形式。如0b1101110、0156、110、0x6E分别是整数110的二进制、八进制、十进制和十六进制表示。
class TestLiterals{
public static void main(String[] args没有任何小数或指数部分) {
int binaryNumber = 0b1101110; //0b开头的二进制整数
int octalNumber = 0156; //0开头的八进制整数
int decNumber = 110; //十进制整数
int hexNumber = 0x6E; // 0x开头的十六进制整数
System.out.println(binaryNumber);
System.out.println(octalNumber);
System.out.println(decNumber);
System.out.println(hexNumber);
}
}
3. Floating-point(浮点)文字量: 浮点文字量是具有小数形式或指数形式的数字文字量。浮点文字量有3种形式:
- 简单的小数形式: 浮点字面量的最简单形式由一个或多个十进制数字和一个小数点 (.) 以及一个可选的后缀(f、F、d 或 D)组成。可选后缀允许您指定文字是浮点数(f 或 F)或双精度值(d 或 D)。默认值(未指定后缀时)为双精度。
1.0F //float类型文字量
1.0D //doule类型文字量
1.0 //doule类型文字量
0.0 // doule类型的浮点数
.0 // doule类型的浮点数
0. // doule类型的浮点数
0f // float类型的浮点数
1F // float类型的浮点数
- 比例小数形式: 比例小数形式由简单小数和一个以E或e开头的指数部分构成。E或e后面是一个有符号的整数。指数部分是小数形式乘以十的幂的简写形式。最后面有一个可选的后缀来区分是float 和 double 文字量。
1.0E1 // 表示 1.0 x 10^1 或者说 10.0 (double类型)
1E-1D // 表示 1.0 x 10^(-1) 或者说 0.1 (double类型)
1.0e10f // 表示 1.0 x 10^(10) 或者说 10000000000.0 (float类型)
- 十六进制形式:十六进制形式与简单和缩放的十进制形式具有类似的语法,但以0x或0X开头、小数和指数部分都以十六进制表示。但指数部分以字母p或P开头而不是以e或E开头。指数表示比例因子,它是2的幂而不是10的幂。如:
0x1.0p1f // 表示1.0 x 2^1
0xff.0p13 // 表示255.0 x 2^13
4. 字符文字量:字符文字量是用单引号括起来的 unicode 字符。 如:
char grade = 'A';
char doubleQuote = '"';
如何表示一些特殊的字符,如单引号字符'
本身?用’'’表示显然不行。为此可以用反斜杠\
字符引入的转义序列来表示这些特殊字符,如\'
表示单引号字符'
、\n
表示换行符、\r
表示回车符、\t
表示制表符。
char doubleQuote = '\'';
char newLine = '\n';
char returnCh = '\r';
char tab = '\t';
5. 字符串文字量: 是包含在双引号内的字符序列。如:
"Hello world" // 包含11个字符的字符串
"" // 长度为0的空字符串
"\"" // 只有一个双引号字符的字符串
"a\tb\t3\n" // 包含转移字符序列的字符串
"https://hwdong.net"
作为练习,请编写完整的程序输出这些字符串的值。
您的打赏是对我最大的鼓励!