Java学习笔记——第三章 基础语法
第三章 语法基础
3.1 类型、变量与运算符
3.1.1 类型
Java可区分为基本类型(Primitive Type)和类类型(Class Type) 两大类型系统,其中,类类型也称为参考类型(Reference Type)。
基本类型主要有:
. 整数:可分为short整数(占2字节,-32768 -- 32767)、int整数(占4字节,-2147483648 -- 2147483647)和long整数(占8字节,-9223372036854775808 -- 9223372036854775807);
. 字节:byte,占一字节,需要逐字节处理数据时使用,表示-128~127的整数。
. 浮点数:主要用来存储小数数值,分为float浮点数(占4字节,-126127)和double(占8字节,-10221023);
. 字符:char主要用来存储字符符号,例如'A','孙'等,JDK 8中Java字符采用Unicode 6.2.0编码,JVM中采用UTF-16 big EndIan,每个字符占2字节,汉字与英文字符都是采用双字节存储。char可表示的Unicode范围0 -- ffff;
. 布尔:boolean代表true和false;
常用的格式控制符号:
System.out.println("%d",args)
其中,
%%表示%;
%d表示以十进制整数格式输出;
%f表示以十进制浮点数格式输出;
%o表示以八进制整数格式输出;
%x表示以十六进制整数格式输出;
%s表示以字符串格式输出;
%c表示以字符符号输出;
%b表示输出Boolean值,结果为true或false;
%h使用Integer.toHexString(arg.hash.Code())
得到输出结果,如果args为null,则输出null;
%n表示输出换行符号。
注:可以在输出浮点型时指定精度和预留的字符宽度。例:
System.out.println("%6.2f",19.234)
预留了6个字符宽度,不足的部分要由空格符补上,输出结果为 19.23。(保留两位小数,19.23只占5个字符,在前面补一个空格)。
3.1.2 变量
1、基本规则
. 变量不可以以数字开头,不可以使用特殊字符,不可以Java的关键词(Keyword)同名,不可以和Java保留字(Reversed word)同名,例如*、&、int、float、goto等都不可以;
. 通常以小写字母开始,并且在每个单字开始时第一个字母使用大写,即驼峰式命名法,例ageOfStudent;
. 方法内部声明的变量称为局部变量,会为变量配置内存空间,但不会给默认值(原来可能有无法预期的值),同时,不可以声明的局部变量未初始化前不可以被引用;
. 在声明的变量前加上final限定,则此变量的值不可被修改!
2、字面常量
int num1 = 12;//十进制表示
int num2 = 0xc;//十六进制表示,以0x开头
int num3 = 014;//八进制表示,以0开头
浮点数除了可以用小数方式直接表示外,还可以使用科学记号表示。例如:
double num4 = 0.0012;
double num5 = 1.2e-3;
表示字符必须使用“ ' ”符号括住字符(注意命名习惯!)。例如:
char s1 = 's';
char lastName = '孙';
转义字符:
char symbol = '\'';
此条命令表示“ ' ”,此处必须使用忽略符号“ \ ”。
常用忽略符号如下:
\\ ————反斜杠\
\' ————单引号
\" ————双引号
\b ————倒退一个字符
\f ————换页
\n ————换行
\r ————光标移至行首
3、数字常量表示法
撰写整数或浮点数常量时可以使用下划线更清楚表示某些数字。例如:
int number1 = 1234_5678;
double number2 = 3.141_592_653;
二进制方式表示某个数可以使用0b开头。例如:
int mask = 0b101010101010;//用二进制表示十进制整数2370
int mask1 = 0b1010_1010_1010;
3.1.3 运算符
1、算数运算
+,-,*,/,%
2、比较、条件运算
比较运算符:>,>=,<,<=,==,!=,true,false(后两个为Boolean类型比较)
System.out.printf("10 != 5 结果 %b%n",10 != 5);//true
System.out.printf("10 >= 5 结果 %b%n",10 >= 5);//true
System.out.printf("10 == 5 结果 %b%n",10 == 5);//false
注:对于类类型声明的参考名称来说,两个参考名称使用==比较时,是比较两个名称是否参考至同一对象!
条件运算符:条件式?成立返回值:失败返回值
int score = 99;
System.out.printf("该学生是否及格? %c%n", score >= 60 ? '是':'否');
3、逻辑运算
&&
AND(且),||
OR(或),!
NOT(非)
对于&&,只要左操作数为false,直接返回false,不会去操作右操作数;
对于||,只要左操作数为true,直接返回true,不用再去运算右操作数;
4、位运算
&(AND与),|(OR或),^(XOR异或),~(补码,按位取反),<<左移(左边移除去的位被丢弃右边补0),>>右移(右边一处去的位被丢弃,左边补上原来的位,即左边原来是0就补0,左边原来是1就补1),>>>(右移后最左边一定是补0)。
注:
1、位运算是逐位进行运算,其中补码运算是将所有位0变为1,1变为0。例如,00000001经补码运算就会变为11111110;但以下程序片段将显示-1,因为byte占一字节,number1储存的0在内存中是位00000000,经补码运算为11111111,用整数表示即为-1:
byte number1 = 0;
System.out.println(~number1);
2、左移相当于将原数值乘以2,右移相当于将原数值除以2,即:
System.out.println("%d",number << 1);//4
System.out.println("%d",number << 2);//8
System.out.println("%d",number << 3);//16
5、递增、递减运算
分为i++、++i、i--、--i等类型,其中将++或--运算符写在变量前,表示现将变量值加或减1,然后再返回变量值;将++或--运算符写在变量后,表示先返回变量值,再对变量加或减1。例如:
int i = 0;
int j = 1;
System.out.println(i++);//0,先打印i的值再将i的值加1
System.out.println(i);//此时将上一条指令i加1之后的值输出,即为1
System.out.println(--j);//0,先将j的值减一再打印j的值
6、指定运算
(引自:http://book.51cto.com/art/200807/83056.htm)
3.1.4类型转换
精度转换(注:写下一个浮点数,编译器自动默认为double类型)
方式一:在浮点数后面加上f:float f1 = 3.14f;
方式二:对数值进行强制转换:f2 = (float) 3.14;
通过以上两种方式可以通过编译。
程序中写下整数时默认使用不超过int类型的长度2147483647,倘若对int型(最大数值为2147483647)变量赋值为2147483648,会造成溢出。使用long c = 21_4748_3648L; 可以通过编译。
自动提升类型 表达式中包含不同类型,运算是以长度最长类型为主。
short e = 1, g = 2;
short h = (short) (g + e);
运算整数时如果不大于int,则自动提升全部在int类型进行计算,int结果无法直接放入short,所以需要强转。
int最大2147483647 + 1会得到-2147483648,即会溢出。
3.2流程控制
3.2.1 if...else条件式
格式:
if(条件式){
描述句;
}else{
描述句;
}
3.2.2 switch语句
switch(变量或表达式) {
case 整数、字符、字符串或Enum:
描述句;
break;
case 整数、字符、字符串或Enum:
描述句;
break;
....
default:
描述句;
}
3.2.3 for循环
for(初始试; 执行结果必须是boolean的重复式; 重复式) {
描述句;
}
注:for循环圆括号中第二个复合描述区块若没有撰写,默认为true,for(;;){}
表示无穷循环。
3.2.4 while循环
格式:
while(条件式){
描述句;
}
其中,上述while循环被称为前测试循环,因为会在循环执行前就进行条件判断。相对于前测试循环,后测试循环是指先执行一些动作,再判断要不要重复,即do...while。语法格式为:
do {
描述句;
}while(条件式);
注:while循环和do...while循环的一个格式区别在于后测试循环是以“ ;”结尾!
3.2.5 break、continue
break可以离开当前的switch、for、while、do...while的区块,并执行区块后下一个描述语句,其中在switch中主要用来中断下一个case比较,在for、while、do...while 中主要用来中断当前循环。
continue略过之后的描述语句,并回到循环去开头进行下一次循环,而不是离开循环!!
注:break和continue还可以配合标签使用!例如:本来break只会离开for循环,设定标签与区块,则可以离开整个区块。
back : {
for(int y = 1; y <= 10; y++) {
if(y == 9) {
System.out.println("break");
break back;
}
}
System.out.println("test");
}
注解:上述程序执行结果只会显示break。back是个标签,当break back时,返回至back标签处,之后整个back区块不执行而跳过,所以System.out.println("test");
不会执行。
但是,continue的标签只能设定在for之前:
back1 :
for(int x = 0; x < 10; x++) {
back2 :
for(int z = 0; z < 10; z++) {
if (z == 9) {
continue back2;
}
}
System.out.println("test");
}
注解:continue back1时,System.out.println("test");
语句不会被执行;
continue back2时,打印10次test。