1. 关键字和保留字
  2. 标识符
  3. 变量
  4. 运算符
  5. 程序流程控制


1. 关键字和保留字

命名时要避开关键字和保留字

关键字:被Java赋予了特殊含义,用做专门用途的字符串。关键字中所有字母都为小写

day02-Java基本语法_保留字

day02-Java基本语法_标识符_02

保留字:现有Java版本尚未使用,但以后版本可能会用做关键字。goto和const

2. 标识符

凡是要自己取名的地方都叫标识符。如类名、变量名、方法名、接口名、包名...

标识符命名规则:

  1. 只能由26个英文字母大小写或0-9或_或$组成
  2. 不可以数字开头
  3. 不可使用关键字或保留字作为标识符,但命名可以包含关键字或保留字
  4. Java严格区分大小写,长度无限制
  5. 标识符不能包含空格

说明:若不遵循命名规则,编译不通过

标识符命名规范:

  • 包名:多单词组成时,所有字母都小写。xxxyyyzzz
  • 类名、接口名:多单词组成时,所有单词的首字母大写。XxxYyyZzz
  • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始首字母大写。xxxYyyZzz
  • 常量名:所有字母大写,多单词组成时每个单词用下划线连接。XXX_YYY_ZZZ

说明:若不遵循命名规范,编译可以通过,但最好遵守规范

取名时要做到能够见名知意

Java常用Unicode字符集,所以标识符可以中汉字声明,但千万不要这样做

3. 变量

概念:内存中的一个存储区域;该区域存储的数据可以在规定范围内不断变化;变量是程序中最基本的存储单元;定义变量包含三部分,变量类型、变量名、存储的值

声明变量注意事项:

  • 变量必须先声明且赋值后才能使用
  • 变量都定义在自己的作用域内,只有在作用域内它才是有效的,出了作用域就失效
  • 同一作用域不能声明两个同名变量

通过使用变量来访问内存中一块存储区域中的数据

变量数据类型

Java对于每一种数据都定义了具体的数据类型(Java是强类型语言),相应的在内存中分配了不同大小的内存空间

day02-Java基本语法_保留字_03

整数类型

说明:

  • Java的整数类型有固定的表示范围和字段长度,不受具体操作系统的影响,以保证Java程序的可移植性
  • Java的整型常量默认为int类型,声明long类型变量后面要加上l或L
  • Java程序中变量通常声明为int,除非不足以表示较大的数才用long

day02-Java基本语法_标识符_04

浮点类型

说明:

  • 带小数点的数值
  • 尽管float占4字节long占8字节,但float能表示的数值范围比long大,因为它存储数据的方式与long类型不同
  • 定义float类型变量时,变量要以f或F结尾
  • float类型的尾数可以精确到7位,double的精度则是float的两倍。定义浮点型变量时通常使用double
  • 与整数类型一样,浮点型也有固定的表示范围和字段长度,不受具体操作系统影响
  • 浮点型常量有两种表示方式:5.12、2.3f或1099e-2
  • Java的浮点型常量默认为double类型

day02-Java基本语法_类型变量_05

字符类型

说明:

  • char类型用来表示一个字符,占用2个字节大小
  • 定义char类型变量,变量值通常放在一对''内,内部只能写一个字符
  • Java中的所有字符都使用Unicode编码,所以char类型可以表示各个国家的文字或符号,如'a'、'9'、'中'
  • 转义字符\,'\n'还是算作一个字符,能被char类型存储,代表换行
  • 对有特殊意义的字符使用\,表示将它转换为普通字符
  • 可以直接使用一个Unicode值来表示一个字符型常量,比如'\u0043'代表的是字符c
  • char类型可以进行运算,因为它对应一个Unicode值
  • UTF-8是互联网上使用最广的一种Unicode的实现方式
  • 源文件中有中文时,将源文件设置为ASCI编码,对应GBK编码,因为Windows下的命令行采用GBK编码

布尔类型

说明:

  • 取值只能是true或false
  • 常用在条件判断和循环结构中

基本数据类型之间的运算

不包含布尔类型

自动类型提升

class VariableTest2 {
public static void main(String[] args) {
byte b1 = 2;
int i1 = 129;
// 编译不通过
// byte i2 = b1 + i1;
int i2 = b1 + i1; // byte和int的运算结果为int类型,所以至少要用int接收
long l1 = b1 + i1; // 所以int和long都能接收
System.out.println(i2); // 131

float f = b1 + i1; // float比long都要大,所以也能用float接收
System.out.println(f); // 131.0

short s1 = 123;
double d1 = s1;
System.out.println(d1); // 123.0

char c1 = 'a'; // 对应ASCII码值为97
int i3 = 10;
int i4 = c1 + i3;
System.out.println(i4); // 107

short s2 = 10;
// 编译不通过,char和short的运算结果是int类型
// char c2 = c1 + s2;

byte b2 = 10;
// 编译不通过,char和byte的运算结果是int类型
// char c3 = c1 + b2;

// 编译不通过,byte和byte类型的运算结果是int类型
// short s4 = b1 + b2;
}
}

***综上总结:将7种基本数据类型按能表示的数据大小排序byte<short、char<int<long<float<double,所以当两个变量做运算时,运算结果会自动转换为两者中较大的类型,所以至少要用二者中较大的数据类型接收

***但有特殊情况,byte、short、char三者做运算时,即使是两个同类型变量的运算,结果都是int类型。这其实是必需的,因为前三者类型能存储的数过小,容易超出存储范围,所以都用int接收最好

强制类型转换

小类型强转成大类型往往会发生精度损失

class VariableTest3 {
public static void main(String[] args) {
double d1 = 12.4;
int i1 = (int)d1; // 强制类型转换
System.out.println(i1); // 12,四舍五入,损失了精度

long l1 = 123;
short s2 = (short)l1; // 123,short能存储这个数,没有精度损失

int i2 = 128;
byte b = (byte)i2; // byte最大存储127
System.out.println(b); // -128,涉及到负数的存储方式。损失了精度
}
}

PS:上面的例子中

class VariableTest4 {
public static void main(String[] args) {
/*
即使没有加l,编译通过。这个数默认是int类型,然后被自动提升
为long赋值给l1
*/
long l1 = 123434;

/*
编译失败,int存储不了这个数,所以必须要在后面加上l,
Java就会将它存在long类型中
*/
// long l2 = 2374923749237493247234;

/*
编译失败,浮点型常量默认类型为double,所以定义float类型变量时变量值
必须加f,Java直接用float类型来存储12.3
*/
/*
若是在12.3前加上(float)使其强转,Java做的是先用double类型存储12.3,
然后截去部分字节变为float
*/
// float f1 = 12.3;

byte b = 12;
// 编译失败,常量1默认的类型是int,所以运算结果至少要用int接收
// byte b1 = b + 1;
// 编译失败,常量12.3默认类型是double,所以运算结果要用double接收
// float f1 = b + 12.3;
}

String类型变量使用

String是引用类型,表示字符串

String类型的变量值放在一对""中

String可以和8种基本数据类型做运算,且只能做连接运算:+,运算结果仍是String类型

class StringTest {
public static void main(String[] args) {
String s1 = "Hello World!";
System.out.println(s1);
String s2 = "a";
String s3 = ""; // 可以给String赋值为空

// 编译不通过,给char类型的赋值不能为空
// char c = '';

int number = 1001;
String numberStr = "学号:";
String info = numberStr + number; // 连接运算
boolean b1 = true;
String info1 = info + b1; // 操作数中出现String类型,+表示连接运算
System.out.println(info1);
}
}
class StringTest {
public static void main(String[] args) {
char c = 'a';
int num = 10;
String str = "hello";
System.out.println(c + num + str); // 107hello,a对应的ASCII码值为97,char类型和int类型之间做加法运算
System.out.println(c + str + num); // ahello10
System.out.println(c + (num + str)); // a10hello
System.out.println(str + num + c); // hello10a 最后结果都为String类型
}
}
class StringTest {
public static void main(String[] args) {
// 打印* *
System.out.println("* *");
System.out.println('*' + '\t' + '*'); // 93,两个加号都表示加法
System.out.println('*' + "\t" + '*'); // * *,两个加号都表示连接运算
System.out.println('*' + '\t' + "*"); // 51*
System.out.println('*' + ('\t' + "*")); //* *
}
}

进制的表示方式

  • 二进制数以0b或0B开头
  • 八进制数以0开头
  • 十六进制数以0x或0X开头