1.1 JAVA主类结构
1.JAVA语言是面向对象的程序设计语言,Java程序的基本组成单元是类,类体中又包括属性与方法两部分。
2.每一个应用程序都必须包含一个main()方法,含有main()方法的类称为主类。
3.一个JAVA应用是由若干个类组成的。
4.通常将类的属性称为类的全局变量(成员变量),将方法中的属性称为局部变量。
5.main()方法是类体中的主方法。该方法从“{”开始,到“}”结束。public、static、void分别是
main()方法的权限修饰符、静态修饰符和返回值修饰符,JAVA程序中的main()方法必须声明成 public static void。String[] args 是一个字符串类型的数组,它是main()方法的参数。
6.在JAVA语言中可以通过import关键字导入相关的类。
1.2 基本数据类型
1.2.1整数类型
整数类型简称整形,用来存储整数数值,即没有小数部分的数值。它可以是正数,也可以是负数。整数类型根据它所占内存大小的不同,可以分为byte、short、int和long,他们具有不同的取值范围。如下表所示。
数据类型 | 内存空间(8位等于1字节) | 取值 |
byte | 8位 | -128~127 |
short | 16位 | -32768~32767 |
int | 32位 | -2147483648~2147483647 |
long | 64位 | -9223372036854775808~9223372036854775808 |
接下来分别对四种数据类型进行介绍。
1.int 型
定义int有四种方法:
int x; //定义int型变量x
int x , y; //同时定义int型变量x,y
int x = 10 , y = -5; //同时定义int型变量x,y 并赋予初值
int x = 5 + 23; //定义int型变量x,并赋予公式(5+23)计算结果的初值
int型变量在内存中占4字节,也就是32位,在计算机中bit是由0和1来表示的在计算机中是这样表示的。
00000000 00000000 00000000 00000101
int型是JAVA整形值的默认数据类型。当对多个尚未被定义数据类型的整形做运算时,运算的结果将默认为int类型。
2.byte型
byte型的定义方式与int型的定义方式相同。
byte a;
byte a , b , c;
byte a = 9 , b = -45;
3.short型
short型的定义方式与int型的定义方式相同。
short s;
short s , t , r;
short s = 1000 , t = -19;
short s = 2000 / 10;
4.long型
由于long型的取值范围比int型大,且属于高级的数据类型,所以在赋值的时候要和int做出区分,需要在整数后加L或者l(小写的L)。
long number;
long number , run;
long number = 12345678L, run = -987654321L;
long number = 123456789L * 987654321L;
1.2.2浮点类型
浮点类型简称浮点型,用来存储含有小数部分的数值。Java中浮点类型分为单精度浮点类型(float)和双精度浮点类型(double),它们具有不同的取值范围。如表1.2所示。
数据类型 | 内存空间(8位等于1字节) | 取值范围 |
float | 32位 | 1.4E-45~3.4028235E38 |
double | 64位 | 4.9E-324~1.7976931348623157E308 |
在默认情况下小数都被看作double型,若想使用float型小数,则需要在小数后面添加F或f。另外,可以使用后缀d或D来明确表明这是一个double类型数据,但加不加d或D并没有硬性规定。
float f1 = 13.23f;
double d1 = 4562.12d;
double d2 = 45678.1564;
1.2.3字符类型
1.char型
字符类型(char)用于存储单个字符,占用16位bit(两个字节)的内存空间。在声明字符型变量时,要以单引号表示,如's'表示一个字符。
char ch = 'a';
由于字母a在Unicode表中的排序位置是97,因此允许将上面的语句写成
char ch = 97;
由于unicode编码采用无符号编码,可以存储65536个字符(0x0000~0xffff),所以Java中的字符几乎可以处理所有国家的语言文字。
2.String型
String类型是字符串类型,可以用来保存多个字符串组成的文本内容,其用法与字符类型相似,但文本内容需要用双引号标注。
3.转义字符
转义字符是一种特殊的字符变量,其以反斜线“\”开头,后跟一个或多个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”。JAVA中的转义字符如表1.3所示。
转义字符 | 含义 | 转义字符 | 含义 |
\ddd | 1~3位8进制数据所表示的字符,如\123 | \r | 回车 |
\uxxxx | 4位16进制数据所表示的字符,如\u0052 | \n | 换行 |
\' | 单引号字符 | \b | 退格 |
\\ | 反斜杠字符 | \f | 换页 |
\t | 垂直制表图,将光标移到下一个制表符的位置 |
将转义字符赋值给字符变量的时候,与字符常量值一样需要使用单引号。
1.2.4布尔类型
布尔类型又称逻辑类型,简称布尔型,通过关键字Boolean来定义布尔类型变量。布尔类型只有true和false两个值,分别代表布尔逻辑中的“真”和“假”。布尔值不能与整数类型进行转换。布尔类型通常被用在流程控制中作为判断条件。
boolean b; //定义布尔类型变量
boolean b1 , b2; //定义布尔类型变量b1、b2
boolean b = ture; //定义布尔类型变量b,并赋值给初值ture
1.3 变量与常量
在程序执行过程中,其值能被改变的量称为变量,其值不能被改变的量称为常量。变量与常量的命名都必须使用合法的标识符。本节将介绍标识符与关键字以及变量与常量的声明方法。
1.3.1 标识符与关键字
1.标识符
标识符可以简单地理解为一个名字,用来标识类名、变量名、方法名、数组名等的有效字符序列。
Java规定标识符由任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字。标识符不能是Java中的保留关键字。
在Java中标识符的字母是严格区分大小写的,如good和Good是两个不同的标识符。Java使用unicode标准字符集,最多可以标识65535个字符,因此,Java中的字母不仅包括a、b、c等,还包括汉字、日文以及其他许多语言中的文字。
2.关键字
关键字又称保留字,是JAVA语言中已经被赋予特定意义的一些单词,不可以吧这些单词作为标识符来使用。JAVA中的关键字如表1.4所示。
abstract | assert | boolean | break | byte | case | catch | char |
extends | final | finally | float | for | goto | if | implements |
import | instanceof | int | interface | long | native | new | package |
private | protected | class | const | continue | default | do | double |
switch | synchronized | this | throw | throws | transient | try | var |
else | enum | public | return | short | static | strictfp | super |
void | volatile | while |
1.3.2 声明变量
变量的使用在程序设计中是一个十分重要的环节。声明变量就是要告诉编译器这个变量的数据类型,这样编译器才知道需要配置多少空间给他,以及它能存放什么样的数据。在程序运行过程中,空间内的值是变化的,这个内存空间就称为变量。为了便于操作给这个空间取名字,称为变量名。变量名必须是合法的标识符。内存空间内的值就是变量值。在声明变量的时候可以不用赋值,也可以直接赋予初值。
变量的命名并不是随意的,应遵循以下几条规则:
1.变量名必须是一个有效的标识符。
2.变量名不可以使用JAVA中的关键字。
3.变量名不能重复。
4.应选择有意义的单词作为变量名。
在JAVA10中提供了一个方便好用的新特性:使用var变量,var是一个关键字,它相当于是一种动态类型。编译器会根据赋给变量的值判断出变量的类型,因此在使用var声明局部变量的时候必须赋予初值。
var 变量名称 = 值
需要注意的是,var不能用于声明成员变量,也不能作为方法的返回值。
1.3.3 声明常量
与变量不同,在程序运行过程中一直不会改变的量称为常量。常量在整个程序中只能被赋值一次,且常量的值可以共享给程序中的所有对象。
在Java中声明一个常量,除了要指定数据类型外,还需要通过final关键字进行限定。
finall 数据类型 常量名称 [ = 值]
final double PI = 3.1415926; // 声明double型常量PI并赋值
final boolean BOOL = true; // 声明boolean型常量BOOL并赋值
当变量被finall修饰的时候,该变量就变成了常量,必须从设定的时候九赋予他初值,否则将会产生编译错误。
1.3.4 变量的有效范围
有一变量被定义出来后只是暂存在内存中,等到程序执行到某个点,该变量会被释放掉,也就是说变量有它的生命周期。因此,变量的有效范围是指程序代码能够访问该变量的区域,若超出该区域,则在编译时会出现错误。在程序中,一般会根据变量的“有效范围”将变量分为“成员变量”和“局部变量”。
1.成员变量
在类体中所生命的变量被称为成员变量,成员变量在整个类中都有效。
如果在成员变量的前面加上static,这样的成员变量被称为静态变量。静态变量的有效范围可以跨类,甚至可以到达整个应用程序内。静态变量除了能在生命他的类中存取,还能直接以
“类名.静态变量”的方式存在其他的类内使用。
2.局部变量
在类的方法中生命的变量(方法内部定义,在“{” 和 “}”之间的代码中声明的变化量)称为局部变量。局部变量只在当前代码块中生效,也就是只能在“{” 和 “}”之间的代码中使用。
在类的方法中声明的变量,包括方法的参数,都属于局部变量。局部变量只能在当前定义的方法内有效,不能用于类的其他方法中。局部变量的生存周期取决于方法,当方法被调用的时候JAVA虚拟机会为方法中的局部变量分配内存空间,当方法调用结束后,会释放方法中局部变量所占用的内存空间,局部变量也会被摧毁。
局部变量可以与成员变量的名字相同,此时成员变量将被隐藏,即成员变量在此方法中暂时失效。
1.4 运算符
1.4.1 赋值运算符
赋值运算符用符号“=”表示,它是一个二元运算符(对两个操作数作处理),其功能是将右方操作数所含的值赋给左方的操作数。例如:
int a = 100;
该表达式是将100赋值给a。左方的操作数必须是一个量,而右边的操作数则可以是变量(如a、number)、常量(如123、‘book’)、有效的表达式(如45*2)。
由于复制运算符“=”处理时,会先取得右方表达式处理的结果,因此如果一个表达式中有两个以上的“=”运算符,会从最右方的“=”开始处理。
1.4.2 算术运算符
Java中的算术运算符主要有+(加号)、-(减号)、*(乘号)、/(除号)、%(求余),它们都是二元运算符。Java中算术运算符的功能及使用方式如表1.5所示。
运算符 | 说明 | 实例 | 结果 |
+ | 加 | 12.45f+15 | 27.45 |
- | 减 | 4.56-0.16 | 4.4 |
* | 乘 | 5L*12.45f | 62.25 |
/ | 除 | 7/2 | 3 |
% | 取余数 | 12%10 | 2 |
其中“+”和“-”运算符还可以作为数值的正负号,如+5,-7。
1.4.3 自增和自减运算符
自增、自减运算符是单目运算符,可以放在变量之前,也可以放在变量之后。操作元必须是一个整型或者一个浮点型变量。自增、自减运算符的作用是使变量的值加1或减1。
++a(--a) //表示在使用变量a之前,先将a+(-)1
a++(a--) //表示在使用变量a之后,先将a+(-)1
b = ++a //先将a的数值+1,再赋值给b,若a初始为4,则现在a = 5,b = 5
b = a++ //将a的数值赋值给b,然后将a的数值+1,则现在a = 5,b = 4
1.4.4 比较运算符
比较运算符属于二元运算符,用于程序中的变量之间、变量和自变量之间以及其他类型的信息之间的比较。比较运算符的运算结果是boolean类型。当运算符对应的关系成立时,运算结果为ture,否则为false。如表1.6所示。
运算符 | 作用 | 举例 | 操作数据 | 结果 |
> | 比较左方是否大于右方 | 'a'>'b' | 整形、浮点型、字符型 | false |
< | 比较左方是否小于右方 | 165<456 | 整形、浮点型、字符型 | ture |
== | 比较左方是否等于右方 | 'c'=='c' | 基本数据引用型、引用型 | ture |
>= | 比较左方是否大于或等于右方 | 479>=426 | 整形、浮点型、字符型 | ture |
<= | 比较左方是否小于或等于右方 | 12.45<=45.5 | 整形、浮点型、字符型 | ture |
!= | 比较左方是否不等于右方 | 'y'!='t' | 基本数据引用型、引用型 | ture |
1.4.5 逻辑运算符
逻辑运算符是对true(真)和false(假)这两种逻辑值进行运算,运算后的结果仍是一个逻辑值。逻辑运算符包括&&(逻辑与)、||(逻辑或)、!(逻辑非)。逻辑运算符计算的值必须是boolean型数据。在逻辑运算符中,除了“!”是一元运算符之外,其他都是二元运算符。如表1.7所示。
运算符 | 含义 | 用法 | 结合方向 |
&&、& | 逻辑与 | op1 && op2 | 从左到右 |
|| | 逻辑或 | op1 || op2 | 从左到右 |
! | 逻辑非 | !op | 从右到左 |
1.4.6 位运算符
位运算的操作数类型是整型,可以是有符号的,也可以是无符号的。位运算符可以分为位逻辑运算符和位移运算符两大类。
1.“按位与”运算
位逻辑与实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求与,若两个操作数对象同一位都为1,则结果对应位为1,否则结果中对应位为0。
2.“按位或”运算
位逻辑或实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求或,若两个操作数对象同一位都为0,则结果对应位为0,否则结果中对应位为1。
3.“按位取反”运算
取反运算符,实际上是将操作数转换成二进制表示方式,然后将各位二进制位由1变为0,由0变为1。
4.“按位异或”运算
位逻辑异或实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求异或,若两个操作数对象同一位不同时,则结果对应位为1,否则结果中对应位为0。
5.移位操作
除了上述运算符,还可以对数据按二进制进行移位操作。JAVA中的移位运算符有三种:
<<: 左移。
>>: 右移。
>>>:无符号右移。
1.4.7 复合赋值运算符
运算符 | 含义 | 举例 | 等价效果 |
+= | 相加结果赋予左侧 | a += b | a = a + b |
-= | 相减结果赋予左侧 | a -= b | a = a - b |
*= | 相乘结果赋予左侧 | a *= b | a = a * b |
/= | 相除结果赋予左侧 | a /= b | a = a / b |
%= | 取余结果赋予左侧 | a %= b | a = a % b |
&= | 与结果赋予左侧 | a &= b | a = a & b |
|= | 或结果赋予左侧 | a |= b | a = a | b |
^= | 异或结果赋予左侧 | a ^= b | a = a ^ b |
<<= | 左移结果赋予左侧 | a <<= b | a = a << b |
>>= | 右移结果赋予左侧 | a >>= b | a = a >> b |
>>>= | 无符号右移结果赋予左侧 | a >>>= b | a = a >>> b |
1.4.8 三元运算符
三元运算符的用法如下:
条件式 ? 值1 :值2
三元运算符的运算法则是:若条件式的值位ture,则整个表达式取值1,否则取值2.
1.4.9 运算符的优先级
优先级 | 描述 | 运算符 | 优先级 | 描述 | 运算符 |
1 | 圆括号 | () | 9 | 按位与运算 | & |
2 | 正负号 | +、- | 10 | 按位异或运算 | ^ |
3 | 一元运算符 | ++、--、! | 11 | 按位非运算 | | |
4 | 乘除 | *、/、% | 12 | 逻辑与运算 | && |
5 | 加减 | +、- | 13 | 逻辑或运算 | || |
6 | 移位运算 | <<、>>、>>> | 14 | 三元运算符 | ?= |
7 | 比较大小 | <、>、>=、<= | 15 | 赋值运算符 | = |
8 | 比较是否相等 | ==、!= |
1.5数据类型转换
类型转换是将一个值从一种数据类型更改为另一种数据类型的过程。例如,可以将String类型数据“457”转换为一个数值型,而且可以将任意类型的数据转换为String类型。
如果从低精度数据类型向高精度数据类型转换时,则永远不会溢出,并且总是成功的;而把高精度数据类型向低精度数据类型转换时,则会有信息丢失,有可能失败。
数据转换有两种方式,即隐式转换和显式转换
1.5.1 隐式类型转换
从低级类型向高级类型的转换,系统将自动执行,程序员无须进行任何操作。这种类型的转换称为隐式转换,也可以称为自动转换。下列基本数据类型会涉及数据转换(不包括逻辑类型),这些类型按精度从“低”到“高”排列的顺序为byte < short < int < long < float < double。
隐式转换也要村寻一定的规则来解决在什么情况下,将哪种类型的数据转换成另一种类型的数据。详细规则如表1.10所示。
操作数1的类型 | 操作数2的类型 | 转换后的数据类型 |
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
1.5.2显式类型转换
当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换(又称强制类型转换),当执行显式类型转换时可能会导致精度缺失。语法如下:
(类型名) 要转换的值
当执行显式类型转换时,可能会导致精度缺失。除boolean类型外,其他基本数据类型都能以显式类型转换的方法实现转换。