Java基本语法(二)
2.1 关键字
定义:被Java语言赋予了特殊含义,用作专门用途的字符串(单词)
特点:关键字中所有字母都为小写
用于定义数据类型的关键字 |
||||
class |
interface |
enum |
byte |
short |
int |
long |
float |
double |
char |
boolean |
void |
|
|
|
用于定义数据类型值的关键字 |
||||
true |
false |
null |
|
|
用于定义流程控制的关键字 |
||||
if |
else |
switch |
case |
default |
while |
do |
for |
break |
continue |
return |
|
|
|
|
用于定义访问权限修饰符的关键字 |
||||
private |
protected |
public |
|
|
用于定义类,函数,变量修饰符的关键字 |
||||
abstract |
final |
static |
synchronized |
|
用于定义类与类之间关系的关键字 |
||||
extends |
implements |
|
|
|
用于定义建立实例及引用实例,判断实例的关键字 |
||||
new |
this |
super |
instanceof |
|
用于异常处理的关键字 |
||||
try |
catch |
finally |
throw |
throws |
用于包的关键字 |
||||
package |
import |
|
|
|
其他修饰符关键字 |
||||
native |
strictfp |
transient |
volatile |
assert |
2.2 标识符
1.标识符:
Java对各种变量、方法和类等要素命名时使用的字符序列称为标识符。
凡是自己可以起名字的地方都叫标识符。
2.定义合法标识符规则:
---由26个英文字母大小写,数字,_或$组成
---数字不可以开头
---不可以使用关键字和保留字,但能包含关键字和保留字。
---Java中严格区分大小写,长度无限制。
---标识符不能包含空格
注意:在起名字的时候,为了提高阅读性,要尽量有意义,“见名知意”。
&abc 2abc class class1 Animal animal last name a age
3.Java中的名称命名规范
1)包名:多单词组成时,所有字母都小写:xxxyyyzzz
2)类名接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
3)变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
4)常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
2.3变量
1.变量的概念:
1)内存中的一个存储区域
2)该区域有自己的名称(变量名)和类型(数据类型)
3)Java中每个变量必须先声明,后使用
4)该区域的数据可以在同一类型范围内不断变化
2.定义变量的格式:数据类型 变量名=初始化值
3.变量是通过使用变量名来访问这块区域的
4.Java是强类型语言,每个变量必须先声明类型,后使用
5.使用变量注意:
变量的作用域:一对{ }之间有效
6.变量的分类:
1)按被声明的位置划分:
- 成员变量:方法外部、类的内部定义的变量
- 局部变量:方法或语句块内部定义的变量
注意:类外面(类对应的大括号外面)不能有变量的声明
2)按所属的数据类型划分:
- 基本数据类型变量
- 引用数据类型变量
3)变量的分类----按数据类型
对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
(1)整数类型:byte、short、int、long
- Java各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证java程序的可移植性。
- Java的整型常量默认为int型,声明long型常量须后加‘l’或‘L’
类 型 |
占用存储空间 |
表数范围 |
byte |
1字节 |
-128 ~ 127 |
short |
2字节 |
-215 ~215-1 |
int |
4字节 |
-231 ~ 231-1 |
long |
8字节 |
-263 ~ 263-1 |
(2)浮点类型:float、double
- 与整数类型类似,Java浮点类型也有固定的表数范围和字段长度,不受具体OS的影响。
- Java的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’。
- 浮点型常量有两种表示形式:
---十进制数形式:如:5.12 512.0f .512 (必须有小数点)
---科学计数法形式:如:5.12e2 512E2 100E-2
类 型 |
占用存储空间 |
表数范围 |
单精度float |
4字节 |
-3.403E38 ~ 3.403E38 |
双精度double |
8字节 |
-1.798E308 ~ 1.798E308 |
(3)字符类型:char
- char型数据用来表示通常意义上的“字符”。
- 字符型常量的三种表现形式:
---字符常量是用单引号(‘ ’)括起来的单个字符,涵盖世界上所有书面语的字符。
例如:char c1 = 'a'; char c2 = '中'; char c3 = '9';
---Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。
例如:char c3 = '\n'; '\n'表示换行符
---直接使用Unicode值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。
如:\u000a 表示 \n。
- char类型是可以进行运算的。因为它都对应有Unicode值。
(4)布尔类型:boolean
- boolean类型适于逻辑运算,一般用于程序流程控制:
---if条件控制语句
---while循环控制语句
---do-while循环控制语句
---for循环控制语句
- boolean类型数据只允许取值true和false,不可以0或非0的整数替代true和false,这点和C语言不同。
7.基本数据类型转换
1)自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:
2)有多种类型的数据混合运算时,系统首先自动将所有数据转化成容量最大的那种数据类型,然后再进行计算。
3)byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
4)当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型。
8.强制类型转换
1)自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符*(()),但可能造成精度降低或溢出,格外要注意。
2)通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
如: String a = “43”; int i = Integer.parseInt(a);
3)boolean类型不可以转换为其它的数据类型。
2.4进制
1.对于整数,有四种表示方式:
- 二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头。
- 十进制:0-9 ,满 10 进 1.
- 八进制:0-7 ,满 8 进1. 以数字 0 开头表示。
- 十六进制0-9 及 A-F,满 16 进1. 以 0x 或 0X开头表示。此处的A-F不区分大小写。
2.所有数字在计算机底部都以二进制形式存在。
3.计算机以补码的形式保存所有的整数。
4.正数的补码与其原码相同;负数的补码是在其反码的末位加1.
5.原码:直接将一个数值换成二进制数。
6.反码:是对原码按位取反,只是最高位(符号位)保持不变。
7.Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;
当是long类型时,二进制默认占64位,第64位是符号位。
8.byte 的范围:-128 ~ 127
9.进制的基本转换
----十进制 二进制互转
十进制转成二进制 除以2取余数
二进制转成十进制 乘以2的幂数
2.5运算符
算数运算符 | 赋值运算符 | 比较运算符(关系运算符) |
逻辑运算符 | 位运算符 | 三元运算符 |
1.算数运算符
运算符 |
运算 |
范例 |
结果 |
+ |
正号 |
+3 |
3 |
- |
负号 |
b=4; -b |
-4 |
+ |
加 |
5+5 |
10 |
- |
减 |
6-4 |
2 |
* |
乘 |
3*4 |
12 |
/ |
除 |
5/5 |
1 |
% |
取模 |
5%5 |
0 |
++ ++ |
自增(前):先运算后取值 自增(后):先取值后运算 |
a=2;b=++a; a=2;b=a++; |
a=3;b=3 a=3;b=2 |
- - - - |
自减(前):先运算后取值 自减(后):先取值后运算 |
a=2;b=- -a a=2;b=a- - |
a=1;b=1 a=1;b=2 |
+ |
字符串相加 |
“He”+”llo” |
“Hello” |
1)算数运算符的注意问题
- 如果对负数取模,可以把模数负号忽略不计,如:5%-2=1。但被模数是负数就另当别论。
- 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如:int x=3510;x=x/1000*1000; x的结果是?
- “+”除字符串相加功能外,还能把非字符串转换成字符串。 例如:System.out.println("5+5="+5+5); //打印结果是?
2.赋值运算符
- 符号:=
- 扩展赋值运算符: +=, -=, *=, /=, %=
3.比较运算符
运算符 |
运算 范例 结果 |
== |
相等于 4==3 false |
!= |
不等于 4!=3 true |
< |
小于 4<3 false |
> |
大于 4>3 true |
<= |
小于等于 4<=3 false |
>= |
大于等于 4>=3 false |
instanceof |
检查是否是类的对象 “Hello” instanceof String true |
注1:比较运算符的结果都是boolean型,也就是要么是true,要么是false。
注2:比较运算符“==”不能误写成“=”
4.逻辑运算符
运算符 |
运算 |
范例 |
结果 |
& |
AND(与) |
false & true |
false |
| |
OR(或) |
false|true |
true |
^ |
XOR(异或) |
true^false |
true |
! |
Not(非) |
!true |
false |
&& |
AND(短路) |
false&&true |
false |
|| |
OR(短路) |
false||true |
true |
1)逻辑运算符用于连接布尔型表达式,在Java中不可以写成 3<x<6,应该写成x>3 && x<6 。
2)“&”和“&&”的区别:
---单&时,左边无论真假,右边都进行运算;
---双&&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
3)和“||”的区别同理,双或时,左边为真,右边不参与运算。
4)异或(^)与或(|)的不同之处是:对于^而言,当左右都为true时,结果为false。 5.位运算符
位运算符的细节 |
|
<< |
被移除的高位丢弃,空缺位补0。 |
>> |
被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 |
>>> |
被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& |
二进制位进行&运算,只有1&1时结果是1,否则是0; |
| |
二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; |
^ |
相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1 |
位运算符 |
||
运算符 |
运算 |
范例 |
<< |
左移 |
3 << 2 = 12 --> 3*2*2=12 |
>> |
右移 |
3 >> 1 = 1 --> 3/2=1 |
>>> |
无符号右移 |
3 >>> 1 = 1 --> 3/2=1 |
& |
与运算 |
6 & 3 = 2 |
| |
或运算 |
6 | 3 = 7 |
^ |
异或运算 |
6 ^ 3 = 5 |
~ |
反码 |
~6 = -7 |
位运算是直接对二进制进行运算。 6.三元运算符
格式:
---(条件表达式)?表达式1:表达式2;
---如果条件为true,运算后发结果是表达式1;
---如果条件为false,运算后发结果是表达式2;
2.6流程控制
--选择结构
1.分支语句根据一定的条件有选择地执行或跳过特定的语句。
2.Java分支语句分类
---if-else语句
---switch语句
3.if-else语句语法格式
if(布尔表达式) {
语句或语句块;
}
else if(布尔表达式){
语句或语句块;
}else {
语句或语句块;
}
4.if-else语句应用举例
public class TestAge{
public static void main(String args[]){
TestAge t = new TestAge();
t.age(75);
}
public void age(int age){
if (age< 0) {
System.out.println("不可能!");
} else if (age>250) {
System.out.println("是个妖怪!");
} else {
System.out.println("此人芳龄 " + age +" 马马乎乎啦!");
}
}
}
5.switch语句语法格式
switch(表达式){
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
… …
case 常量N:
语句N;
break;
[default:
语句;
break;]
}
6.switch语句有关规则
- switch(表达式)中表达式的返回值必须是下述几种类型之一:int,byte,char,short,枚举,字符串;
- case子句中的值必须是常量,且所有case子句中的值应是不同的;
- default子句是任选的;
- break语句用来在执行完一个case分支后使程序跳出switch语句块;
--循环结构
1.循环语句功能:在循环条件满足的情况下,反复执行特定代码
2.循环语句的四个组成部分
- 初始化部分(init_statement)
- 循环条件部分(test_exp)
- 循环体部分(body_statement)
- 迭代部分(alter_statement)
3.循环语句分类
- for循环
- while循环
- do/while循环
4.for循环语句
语法格式:for(初始化表达式;布尔值测试表达式;更改表达式){
语句或语句块;
}
5.while循环语句
语法格式:[初始化语句]
while(布尔值测试表达式){
语句或语句块;
[更改语句;]
}
6.do/while循环语句
语法格式:[初始化语句]
do{
语句或语句块;
[更改语句;]
}while(布尔值测试表达式);
7.特殊流程控制语句
1)break语句
break语句用于终止某个语句块的执行
{ ……
break;
……
}
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ……
label2: { ……
label3: { ……
break label2;
……
}
}
}
2)continue语句
- continue语句用于跳过某个循环语句块的一次执行
- continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环。
3)特殊流程控制语句说明
- break只能用于switch语句和循环语句中。
- continue只能用于循环语句中。
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
- break和continue之后不能有其他的语句,因为程序永远不会执行break和continue之后的语句。
2.7数组
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理。
- 数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量。
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
--一维数组
1) 一维数组的声明方式:type var[] 或 type[] var;
例如: int a[];
int[] a1;
double b[];
Mydate []c; //对象数组
2)Java语言中声明数组时不能知道其长度(数组中元素的数)
例如: int a[5]; //非法
3)数组元素的引用
- Java中使用关键字new创建数组对象
- 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
- 数组元素的引用方式:数组名[数组元素下标]
---数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
---数组元素下标从0开始;长度为n的数组合法下标取值范围:0~n-1;
如int a[]=new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]
- 每个数组都有一个属性length指明它的长度,例如:a.length 指明数组 a 的长度(元素个数)
4)数组元素的默认初始化
数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。例如:
public class Test {
public static void main(String argv[]){
int a[]= new int[5];
System.out.println(a[3]); //a[3]的默认值为0
}
}
5)数组元素的默认初始值
6)创建基本数据类型数组
Java中使用关键字new创建数组对象:
public class Test{
public static void main(String args[]){
int[] s;
s = new int[10];
for ( int i=0; i<10; i++ ) {
s[i] =2*i+1;
System.out.println(s[i]);
}
}
}
创建基本数据类型一维数组对象演示:
处内存状态
7)创建对象数组
创建元素为引用类型(对象)的数组
class MyDate {
private int day;
private int month;
private int year;
public MyDate(int d,int m,int y){
day=d;month=m;year=y;
}
public void display(){
System.out.println(day+"-"+month+"-"+year);
}
}
public class Test02 {
public static void main(String[] args) {
MyDate[] m;
m=new MyDate[10];
for(int i=0;i<10;i++){
m[i]=new MyDate(i+1,i+1,1990+i);
m[i].display();
}
}
}
创建元素为引用类型(对象)的数组演示
处内存状态 处内存状态 for循环执行三次后内存状态
8)数组初始化
- 动态初始化:数组定义与为数组元素分配空间并赋值的操作分开进行。
int a[];
a=new int[3];
a[0] = 3;
a[1] = 9;
a[2] = 8;
MyDate dates[];
dates = new MyDate[3];
dates[0] = new MyDate(22, 7, 1964);
dates[1] = new MyDate(1, 1, 2000);
dates[2] = new MyDate(22, 12, 1964);
- 静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
int a[]={3,9,8};
MyDate dates[]={
new MyDate(22,7,1964),
new MyDate(1,1,2000),
new MyDate(22,12,1964)
};
--多维数组
1.二维数组举例
int [][] a = {{1,2},{3,4,0,9},{5,6,7}};
i j |
j = 0 |
j = 1 |
j = 2 |
j = 3 |
i = 0 |
1 |
2 |
|
|
i = 1 |
3 |
4 |
0 |
9 |
i = 2 |
5 |
6 |
7 |
|
2.Java中多维数组被做为数组的数组处理。
3.Java中多维数组的声明和初始化应按从高维到低维的顺序进行
int t[][]=new int[4][]; //t有4行,第一个维数不空即可
t[0]=new int[5]; //每一行都是一个有5个元素的一维数组
t[1]=new int[5];
int t1[][] = new int [][4]; //非法
4.Java中多维数组不必须是规则矩阵形式
int[][] tt = new int[4][];
tt[0] = new int[2];
tt[1] = new int[4];
tt[2] = new int[6];
tt[3] = new int[8];
int tt[][] = new int[4][5]; //tt是一个4行5列的二维数组
int [][] aa = new int[4][];
aa[0] = new int[5];
aa[1] = new int[1];
aa[2] = new int[3];
//…
5.多维数组初始化
- 静态初始化
int intArray[][] = {{1,2},{2,3},{3,4,5}};
int intArray1[3][2] = {{1,2},{2,3},{4,5}};
//illegal,等号左边不能指定维数
- 动态初始化
int a[][] = new int[4][5];
int b[][] = new int[3][]
b[0] = new int[2];
b[1] = new int[3];
b[2] = new int[5];
6.数组排序
Java.util.Arrays类的sort()方法提供了数组元素排序功能:
import java.util.*;
public class Test06 {
public static void main(String[] args) {
int [] number = {5,900,1,5,77,30,64,700};
Arrays.sort(number);
for(int i=0;i<number.length;i++){
System.out.println(number[i]);
}
}
}