java基础语法
java程序构成
逻辑构成
Java源程序逻辑构成分为两大部分:程序头包的引用和类的定义。
l 程序头包的引用
主要是指引用JDK软件包自带的包,也可以是自己定义的类。引用之后程序体中就可以自由应用包中的类的方法和属性等。
l 类的定义
Java源程序中可以有多个类的定义,但必须有一个主类,这个主类是Java程序运行的入口点。在应用程序中,主类为包含main方法的类;在Applet中,主类为用户自定义的系统Applet类的扩展类。在Java源程序中,主类的名字同文件名一致。
类的定义又包括类头声明和类体定义。类体中包括属性声明和方法描述。下面来看一个例子,其中斜体表示的语句行为主类类头,主类类头下面从大括号“{”开始到“}”结束的部分称为主类类体。
物理构成
Java源程序物理上由三部分构成,分别为语句、块和空白。
(1) 语句指一行以分号“;”结束的语句。
(2) 块指用括号对{}界定的语句序列,块可以嵌套使用。
(3) 空白指语句之间、块内部或者块之间的空白行。空白不影响Java源程序的编译和运行,适当地运用空白,可以形成良好的代码风格。
注释语句
注释语句主要用来进行一些说明,或者标记一些无用的程序语句。有两种注释方法,行注释为以//开始的行;块注释以/*开始和*/结束,Java编译器忽略注释后的程序语句或说明。
标识符、关键字和转义符
在Java语言中,标识符是赋予变量、类和方法等的名称。标识符由编程者自己指定,但需要遵循一定的语法规范:
(1) 标识符由字母、数字、下划线(_)、美元符号($)组成,但美元符号用得较少。
(2) 标识符从一个字母、下划线或美元符号开始。
(3) Java语言中,标识符大小写敏感,必须区别对待。
(4) 标识符没有最大长度的限制,但最好表达特定的意思。
(5) 标识符定义不能是关键字。
关键字又称保留字,是指Java语言中自带的用于标志数据类型名或者程序构造名等的标识符,如public、double等。
转义符是指一些有特殊含义的、很难用一般方式表达的字符,如回车、换行等。所有的转义符以反斜线(\)开头,后面跟着一个字符来表示某个特定的转义符,如下表所示。
引用方法 |
含义 |
\b |
退格 |
\t |
水平制表符Tab |
\n |
换行 |
\f |
表格符 |
\r |
回车 |
\' |
单引号 |
\" |
双引号 |
\\ |
反斜杠 |
数据类型,变量和常量
l 数据类型
Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在java中一共有8种基本类型(primitive type),其中4种整型,2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型;引用数据类型包含数组,类和接口。
分 类 |
数据类型 |
关键字 |
占字节数 |
缺省数值 |
取 值 范 围 |
整型类 |
字节型 |
byte |
8 |
0 |
-2 7~2 7-1 |
短整型 |
short |
16 |
0 |
-2 15~2 15-1 | |
整型 |
int |
32 |
0 |
-2 31~2 31-1 | |
长整型 |
long |
64 |
0 |
-2 63~2 63-1 | |
文本类 |
字符型 |
char |
16 |
′\u 0000′ |
′\u 0000′ ~ ′\u FFFF′ |
浮点类 |
浮点型 |
float |
32 |
0.0F |
— |
双精度型 |
double |
64 |
0.0D |
— | |
逻辑类 |
逻辑型 |
boolean |
8 |
False |
True、False |
Ø 整型
整型用来表示正负整数。包含byte,short,int,long四种。
其中int最常用范围在(-2147483648—2147483647)即21亿,大于21亿就需要使用long类型(-9223372036854775808-9223372036854775807)。
int intNum = 100;
byte byteNum = 100B;
short shortNum = 100S;
long longNum = 100L;
可以采用其他进制表示数据:16进制开头加“0x”,8进制开头加“0”;
从JDK7开始可以用二进制表示:
int binNum = 0b1001;
JDK7之后可以使用字面量表示数值:
int num = 100_223_111;
java编译器会去掉下划线。
Ø 浮点
浮点类型包含float和double两种,double精度是float的2倍(因此称为双精度)。
float floatNum = 3.14F;
double dblNum = 3.14D;//其中D可以省略
注意:浮点类型精确性不适合金融领域进制舍入的情况,如2.0-1.1,如需精确计算,需使用BigDecimal。
Ø char
char类型用来表示单个字符。通常用来表示字符常量。能表示Unicode字符,可表示一个中文汉字。
char aChar = ‘A’;
char chineseChar = ‘\u4e00’;
Ø boolean布尔
boolean数据类型有两种值:true和false。数值类型无法和boolean类型转换。
例如:boolean flag = true;
上述语句声明变量flag为boolean 类型,它被赋予的值为true。
² String类型(不是基本数据类型)
Java字符串就是Unicode字符序列。字符串不是基本数据类型,而是java类库自定义的一个类型。用双引号来定义。
String message = “Hello World!”;
方法 |
作用 |
示例 |
length() |
字符串的长度 |
String s = “hello”; int len = s.length(); len=5; |
charAt() |
某一个位置的字符 |
char ch = “abc”.charAt(1); //ch为b |
getChars() |
获取多个字符 getChars(int sourceStart,int sourceEnd,char target[],int targetStart) |
String s="this is a method to test getChars."; char buf[]=new char[20]; s.getChars(10,14,buf,0); |
getBytes() |
得到一个系统默认的编码格式的字节数组 |
String content = "abcdefg"; System.out.println(content.getBytes()[0]); |
toCharArray() |
将字符串转换为一个新的字符数组 |
String content = "abcdefg"; System.out.println(content.toCharArray()[0]); |
equals() |
判断字符内容是否相同,复写了object类中的equals方法 |
String content = "abcdefg"; System.out.println(content.equals("abcdefg")); |
equalsIgnoreCase() |
判断内容是否相同,并忽略大小写 |
String content = "abcdefg"; System.out.println(content.equalsIgnoreCase("AbcDEfg")); |
regionMatches() |
测试两个字符串区域是否相等 |
String content = "abcdefg"; String toCompare = "defabc"; System.out.println(content.regionMatches(0, toCompare, 3, 3)); |
startsWith() |
字符串是否以指定内容开头 |
String content = "abcdefg"; System.out.println(content.startsWith("abc")); |
endsWith() |
字符串是否以指定内容结尾 |
String content = "abcdefg"; System.out.println(content.endsWith("def")); |
indexOf() |
查找字符或者子串第一次出现的地方 |
String content = "abcdefg"; System.out.println(content.indexOf("d")); |
lastIndexOf() |
查找字符或者子串最后一次出现的地方 |
String content = "abcdefga"; System.out.println(content.lastIndexOf("a")); |
substring() |
字符串截取,包含开头不包含结尾 |
String content = "abcdefga"; System.out.println(content.substring(0,3)); |
concat() |
连接两个字符串 |
String content = "abcdefg"; System.out.println(content.concat("hijk")); |
replace() |
字符串替换 |
String s="Hello".replace('l','w'); |
类型转换:
实线箭头表示无信息丢失的转换,虚线箭头表示有信息丢失的转换;
不同类型运算过程中先进行隐式的转换才进行:
如果两个操作数中有一个为double,则另外一个转换成double。
如果两个操作数中有一个为float,则另一个转换成float。
如果两个操作数中有一个为long,则另一个转换成long。
如果两个操作数中有一个为int,则另外一个转换成int。
double-float-long-int(级别逐次降低)。
高级别向低级别需要强制类型转换:
double a = 20; int b = (int) a; |
由1到3需要强制类型转换。
由3到1不需要强制类型转换。
l 变量与常量
常量是指整个运行过程中不再发生变化的量,例如数学中的π= 3.1415926,在程序中需要设置成常量。而变量是指程序的运行过程中发生变化的量,通常用来存储中间结果,或者输出临时值。
变量的声明也指变量的创建。执行变量声明语句时,系统根据变量的数据类型在内存中开辟相应的存储空间并赋予初始值。变量有一个作用范围,超出它声明语句所在的块就无效。
Java 是强类型语言。每一个变量必须属于一种类型(type)。声明过程中变量的类型在变量的名称之前:
double salary;
int age;
long width;
boolean isAudit;
变量名称可以是字母(大小写)、数字、下划线和$的组合不能以数字开头,也可以是Unicode字符的组合。大小写敏感,且无长度限制,为便于理解最好采用有意义的组合。
变量在声明之后,使用之前,必须以显式的方式进行初始化千万不要使用未初始化的数据。
int salary ;
salary = 100;
或:
int age = 80;
养成良好的编码习惯,变量声明之后,在尽可能靠近的地方初始化。
在java种使用关键字final指明常量:
final double PI = 3.1415926;
关键字final表示某个变量只能被赋值一次,一旦赋值不可再修改。习惯上常量名使用大写,多单词常量用下划线(_)分隔,如:MAX_LIMIT_COUNT。
运算符表达式
Java常用的运算符分为五类:算术运算符、赋值运算符、关系运算符、布尔逻辑运算符、位运算符。位运算符除了简单的按位操作外,还有移位操作。按位操作返回布尔值。
算数运算符:
运算符 |
含义 |
示例 |
求值 |
+ |
加法运算符,求两个操作数的和。 |
c = a + b |
|
- |
减法运算符,求两个操作数的差。 |
c = a - b |
|
* |
乘法运算符,求两个操作数的积。 |
c = a * b |
|
/ |
除法运算符,求两个整数的余数。 |
c = a / b |
|
% |
求余运算符,求两个操作数的余数。 |
c = a % b |
|
++ |
自增 |
a++ |
a = a + 1 |
-- |
自减 |
b-- |
b = b – 1 |
- |
取负数,该运算符是单目运算符 |
c= -a |
c = c - a |
注意:
++:分为前加加,后加加。
前加加:++a 表示先把a的值加一再执行整个语句;
int a = 2; int b = ++a; System.out.println(b); |
b=3
后加加:a++先执行整个语句,再把a的值加一。
int a = 2; int b = a++; System.out.println(b); |
b=2
赋值运算符:
运算符 |
含义 |
示例 |
求值 |
= |
将右侧值赋予左侧 |
c = a |
c = a |
+= |
相加并赋值 |
c += a |
c = c + a |
-= |
相乘并赋值 |
c *= a |
c = c * a |
/= |
相除并赋值 |
c /= a |
c = c / a |
%= |
取模并赋值 |
c %= a |
c = c % a |
关系运算符:关系运算符用于比较两个操作数之间的关系,返回一个布尔值
运算符 |
含义 |
示例 |
== |
等于 |
a==b |
!= |
不等于 |
a!=b |
> |
大于 |
a>b |
< |
小于 |
a<b |
>= |
大于或等于 |
a>=b |
<= |
小于或等于 |
a<=b |
布尔逻辑运算符:
运算符 |
含义 |
示例 |
& |
逻辑与 |
A & B |
| |
逻辑或 |
A | B |
^ |
逻辑异或 |
A ^ B |
! |
逻辑反 |
! A |
|| |
短路或 |
A || B |
&& |
短路与 |
A && B |
逻辑运算符常见运算结果:
A |
B |
A & B |
A | B |
A ^ B |
! A |
true |
false |
false |
true |
true |
false |
false |
true |
false |
true |
true |
true |
false |
false |
false |
false |
false |
true |
true |
true |
true |
true |
false |
false |
逻辑与:使用&&表示,逻辑与是个双目运算符(即有两个操作数的运算符) ,只有当两个操作数都为真的时候,结果才为真;其余情况结果均为假。逻辑与表示数学中“且”的意思。
逻辑或:使用||表示,逻辑或也是个双目运算符,只有当两个操作数都为假的时候,结果才为假;其余情况结果均为真。逻辑或表示数学中“或”的意思。
注意:逻辑短路
短路逻辑与(&&):如果第一个操作数为 false,那么结果肯定就是 false,所以在这种情况下,将不会执行逻辑与后面的运算了,即发生了短路。而“&“要所有的判断条件都进行运算。
短路逻辑或(||):如果第一个操作数为 true,那么结果肯定就是 true,所在在这种情况下,将不会执行逻辑或后面的运算了,即发生了短路。而“|“所有的判断条件都进行运算。
位运算符:
运算符 |
含义 |
原则 |
示例 |
& |
按位与运算符 |
第一个操作数的的第n位与第二个操作数的第n位如果都是1,那么结果的第n为也为1 |
A & B |
| |
按位或运算符 |
第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0 |
A | B |
~ |
按位非运算符 |
操作数的第n位为1,那么结果的第n位为0,以此类推。 |
~A |
^ |
按位异或运算符 |
第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0 |
^ A |
<< |
左移 |
左移动相应的位数,低位补0 |
A << 2 |
>> |
右移 |
右移相应的位数,高位补符号位 |
A >> 2 |
>>> |
无符号右移 |
右移相应的位数,高位补0,负数会移成正数 |
A >>> 2 |
// 1、左移( << ) // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:// // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20 System.out.println(5 << 2);// 运行结果是20
// 2、右移( >> ) 高位补符号位 // 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0: // 0000 0000 0000 0000 0000 0000 0000 0001 System.out.println(5 >> 2);// 运行结果是1
// 3、无符号右移( >>> ) 高位补0 // 例如 -5换算成二进制后为:0101 取反加1为1011 // 1111 1111 1111 1111 1111 1111 1111 1011 // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位: System.out.println(5 >> 3);// 结果是0 System.out.println(-5 >> 3);// 结果是-1 System.out.println(-5 >>> 3);// 结果是536870911
// 4、位与( & ) // 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0 System.out.println(5 & 3);// 结果为1 System.out.println(4 & 1);// 结果为0
// 5、位或( | ) // 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0 System.out.println(5 | 3);// 结果为7
// 6、位异或( ^ ) // 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0 System.out.println(5 ^ 3);//结果为6
// 7、位非( ~ ) // 操作数的第n位为1,那么结果的第n位为0,反之。 System.out.println(~5);// 结果为-6 |
运算符的优先级:
表达式是由常量、变量、对象、方法调用和操作符组成的式子。表达式必须符合一定的规范,才可被系统理解、编译和运行。表达式的值就是对表达式自身运算后得到的结果。
表达式例子:
X;
X+10;
Student.getName();
arr[10];
y=x+10;
Java规范相关
1. 一般规范
Ø 尽量使用完整的英文描述符
Ø 采用适用于相关领域的术语
Ø 采用大小写混合使名字可读
Ø 尽量少用缩写,但如果用了,要明智地使用,且在整个工程中统一
Ø 避免使用长的名字(小于 15 个字母是个好主意)
Ø 避免使用类似的名字,或者仅仅是大小写不同的名字
Ø 避免使用下划线(除静态常量等)
Ø 缩进2个空格
2. 注释规范
Ø 注释应该增加代码的清晰度
Ø 保持注释的简洁
Ø 在写代码之前写注释
Ø 注释出为什么做了一些事,而不仅仅是做了什么