关键字和保留字
都是小写,保留字有goto,const。
标识符
凡是自己可以起名字的地方都是标识符,比如:类名,包名,方法名,接口名,变量名
命名规则
- 由26个英文字母大小写,0-9,_或$组成
- 数字不能开头
- 不可以使用关键字和保留字,但是可以包含关键字和保留字
- Java严格区分大小写,长度无限制
- 标识符不能包含空格
命名规范
- 包名:多个单词组成时都小写 xxxyyyzzz
- 类名,接口名:多个单词时,所有单词的首字母大写 XxxYyyZzz
- 变量名,方法名:多个单词时,第一个单词首字母小写,第二单词开始首字母大写 xxxYyyZzz
- 常量名:所有字母都大写,多个单词时用下划线链接 XXX_YYY_ZZZ
- 在命名的时候尽量做到见名知意
变量的使用
格式
数据类型 变量名 = 变量值;
说明
- 变量必须先声明才能使用
- 变量都定义在其作用域中,在作用域中是有效的,出了作用域是无效的
- 同一个作用域,不能声明两个同名的变量
Java的数据类型
按照数据类型来分
- 基本数据类型 primitive type
- 数值型
- 整数类型 byte,short,int,long
- 浮点类型 float,double
- 字符型 char
- 布尔型 boolean
- 数值型
- 引用数据类型 reference type
- 类 class
- 接口 interface
- 数组 array
按照在类中声明的位置
成员变量 VS 局部变量
class Test{
public static void main(String[] args) {
// 按照变量名命名规范并声明
int myNumber;
// 变量的赋值
myNumber = 1100;
System.out.printf("%d\n",myNumber);
// 数据类型 变量名 = 变量值;
int myAge = 22;
System.out.println(myAge);
/*
整数类型 byte short int long
占用空间 1字节 2字节 4字节 8字节
1字节 = 8bit
byte的范围 -128 ~~ 127
*/
// Byte
byte b1 = -128;
System.out.println(b1);
// Short
Short s1 = 128;
System.out.println(s1);
// int 4字节
int i1 = 32323;
System.out.println(i1);
// 声明Long类型的变量,必须以'l'或'L'结尾
Long l1 = 212412412412l;
long l2 = 12312432234234L;
System.out.println(l1);
System.out.println(l2);
/*
浮点类型 float double
占用空间 4字节。 8字节
float 单精度 位数可以精确到7位有效数据
double 双精度
Java中默认的浮点类型为double,在声明float类型的变量时,必须以'f'或'F'结尾
*/
double d1 = 12.4124;
float f1 = 2312.1231f;
System.out.println(d1);
System.out.println(f1);
/*
字符型 char(1 字符= 2 字节(byte) = 16 bit)
声明char型变量,通常使用一对'',注意的是只能放一个字符
\n 换行符 和 \t 制表符也算是一个字符
*/
char c1 = '中';
System.out.println(c1);
char c2 = '\u0043';
System.out.println(c2);
/*
布尔类型 boolean
只能取两个数值之一 :true或false
*/
boolean bo1 = true;
System.out.println(bo1);
if (bo1) {
System.out.println("你没有\"女朋友\"!");
}else{
System.out.println("你也没有女朋友!");
}
}
}
基本数据类型之间的运算规则
自动类型提升
- byte,char,short < int < long < float < double
- byte,char和short三种类型的变量进行运算时结果的数据类型都为int
- 当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型
- 容量是指变量类型的数据表示范围
强制类型转换
- 需要使用强转符:()
- 强制类型转换,可能会导致精度损失
class Test2{
public static void main(String[] args){
byte b1 = 2;
int i1 = 12;
/*
错误: 不兼容的类型: 从int转换到byte可能会有损失
byte b2 = b1 + i1;
*/
int i2 = b1 + i1;
System.out.println(i2);
float f1 = b1 + i1;
System.out.println(f1);
short s1 = 123;
double d1 = s1;
System.out.println(s1);
System.out.println(d1);
char c1 = 'a';
int i3 = 10;
int i4 = c1 + i3;
System.out.println(i4);
//****************************//
// 强制转换
double d2 = 12.999;
int i5 = (int)d2;
System.out.println(i5);
// byte数值范围 -128~~127
int i6 = 128;
byte b2 = (byte)i6;
System.out.println(b2);
}
}
String类型变量的使用
- String属于引用类型
- 声明String类型变量时,使用一对 “”
- String可以和8种基本数据类型变量做运算,且只能进行连接操作: +
- String连接操作的结果是String类型
class Test3{
public static void main(String[] args){
String s1 = "你好!";
System.out.println(s1);
/*
char c = '';
编译不通过,必须放一个
*/
int myNumber = 52;
String myChar = "我是学号是:";
String myInfo = myChar + myNumber;
System.out.println(myInfo);
// 练习1
char c = 'a';
int num = 10;
String str = "hello";
System.out.println(c + num + str);
System.out.println(c + str + num);
System.out.println(c + (num + str));
System.out.println((c + num) + str);
System.out.println(str +num + c);
/*
练习2
需要打印 * *
注意: char类型和char使用操作符+时,需要考虑是不是会引起ANSII相加
*/
System.out.println("*\t*");
}
}
进制
- 二进制(binary):0,1 以0b或0B开头
- 八进制(octal): 0-7 已0开头
- 十进制(decimal):0-9
-十六进制(hex):0-9及A-F(A到F不区分大小写) 以0x或0X开头
class Test4{
public static void main(String[] args) {
// 分别为二,八,十,十六进制
int num1 = 0B110;
int num2 = 0110;
int num3 = 110;
int num4 = 0X110B;
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
System.out.println("num3 = " + num3);
System.out.println("num4 = " + num4);
/*
1字节 = 8bit
八位bit,头部的bit代表了数的正负,0为正,1为负
二进制时正数的原码,反码,补码都一样
负数的补码等于其反码+1
在计算机底层都以补码的方式来存储数据
*/
}
}
Byte类型
已知Byte类型的数值范围是-128~127,有没有想过为什么是这样的呢。首先Byte占用空间是一个字节,一个字节等于八个bit。
负数补码的计算
正数的原码,反码和补码时一样的。而负数的原码,反码和补码需要通过计算得到。如下所示时-14的原码。
1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 |
---|
下图是-14的反码,反码时除了头部的正负数标志(红色标记位)外,其他位取反。
1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
---|
下图是-14的补码,补码是在反码的基础上+1,注意尾部绿色是+1后的结果。
1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 |
---|
取值范围的验证
已知Byte类型的最大值是127,其原码,反码和补码如下图所示。
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
那么-127的原码应该下图所示,我们计算其补码。
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
下图是-127反码,反码时除了头部的正负数标志(红色标记位)外,其他位取反。
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
下图是-127的补码,补码是在反码的基础上+1,注意尾部绿色是+1后的结果。
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
上边是-127的补码,其尾部只有一位数值,则-128的补码应该是-127的补码的基础上-1,具体如下所示。如此可以得出结论Byte的最小值为-128。
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
数值溢出
我们使用int类型(4字节=32bit)的数值128强制转换为byte(1字节=8bit)类型,再打印出来发现数据变成了-128。强制转换就是删除9-32bit的数值,其底层的具体过程如下。下边是int类型的数值,数值是128。共32位,从右往左读,蓝色间隔8位。
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
然后我们进行了强制转换截取了后八位,计算机认为得到的是补码,因为计算机底层是用补码存储的,红色的位置代表了符号位。
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
我们根据得到的这个补码可以得知是-128,之所以没有反推其反码和原码,是因为八位下的补码表示范围位-127~127。下图是运行的强制运行转换的截图。