02.01_常量的概述和使用
- A:什么是常量
- 在程序执行的过程中,它的值不可以发生改变。
- B:Java中常量的分类
- 字面值常量
- 自定义常量
- C:字面值常量分类
- 字符串常量
- 用双括号引起来的内容
- 整数常量
- 所有整数
- 小数常量
- 所有小数
- 字符常量
- 用单引号括起来的内容,里面只能放单个数字,单个字母或者单个符号
- 布尔常量
- 只有true和false
- 空常量
- null
- 字符串常量
- D:案例演示
class Demo1_Constant {
public static void main(String[] args) {
System.out.println("abc"); //字符串常量
System.out.println(123); //整数常量
System.out.println(12.3); //小数常量
//System.out.println('10'); //''中必须放的是单个字符,10表示的是字符1和字符0
//System.out.println(''); //''中什么也不放,也是不可以的,因为代表不了任何字符
System.out.println(' '); //代表空格字符
System.out.println(true); //boolean类只有两个值,true和false
System.out.println(false);
}
}
02.02_进制概述
- A:什么是进制
- 进制就是进位制,是人们规定的一种进位方法。对于任意一种进制——x进制,表示运算时是逢x进一位。
- B:十进制的由来
- 十进制的由来是因为人类有十个手指头。早期人们在计算物体个数的时候,用一个手指头表示一个物体,所以我们一般使用的是十进制。
- C:二进制的由来
- 18世纪德国数理哲学大师莱布尼茨从《易经》中读到八卦的组成结构,发现其基本由基本素数(0)(1)组成,即阴爻和阳爻,其进位制就是二进制。20世纪被称作第三次科技革命的重要标志之一的计算的发明和应用,其运算模式正是二进制,它不但证明了莱布尼茨的原理是正确的,同时也证明了《易经》数理学很了不起。
- 早期的计算机是通过控制电路开关的闭合来传输数据。一个开关有两种状态,太少;二个开关就有4种状态,依然太少。所以后来有人提议用8个开关的状态表示计算机中的最小单位,这就是一个字节(byte),而每一个开关表示一位(bit)。以前叫电信号,后来用数字表示,为数字信号,即用0和1表示每个开关的状态。即1byte=8bit,但后来用byte表示大的数据文件,表示量太大,所以就产生了k,m,g,t等单位,它们之间的进制为1024。
- 硬盘(500g变465g):买来的硬盘厂商上写的是500g,但到了计算机里就只有465g,原因是,厂商里使用的是以1000为进制,而计算机里的以1024为进制,所以有 465 ( g ) ≈ 500 ∗ 1000 ∗ 1000 ∗ 1000 / 1024 / 1024 / 1024 ( g ) 465(g) \approx 500*1000*1000*1000/1024/1024/1024(g) 465(g)≈500∗1000∗1000∗1000/1024/1024/1024(g)
- D:八进制的由来
- 任何数据在计算机中都是以二进制的形式表示的,一个整数在内存中也是用二进制表示的,但使用一大串的1和0组成的数值进行使用很麻烦。
- 所以就想把一大串缩短点, 将二进制中的三位用一位表示。而三位可以取到的最大值是7,超过7就进位了,这就是八进制。
- E:十六进制的由来
- 对于过长的二进制变成八进制还是较长,所以出现用4位二进制数表示一位的情况,这就是十六进制。
- F:不同进制的形式特点
- 进制越大,表现形式越短。
02.03_不同进制数的表现形式
- A:二进制的表现形式
- 由0和1组成,以0b(b可以大写,也可以小写)开头(JDK1.7版本后可以表示二进制)
- B:八进制的表现形式
- 由0,1…7组成,以0开头。
- C:十进制的表现形式
- 由0,1…9组成,整数默认是十进制的。
- D:十六进制的表现形式
- 由0,1…9,a,b,c,d,e,f(大小写均可)组成,以0x开头。
- E:案例
class Demo1_Scale {
public static void main(String[] args) {
System.out.println(0b100); //4
System.out.println(0100); //64
System.out.println(100); //100
System.out.println(0x100); //256
}
}
02.04_原码反码补码
- A:为什么要学习原反补?
- 后面要学习强制类型转换,如果不知道原反补就会看不懂结果。
- B:有符号数据表示的几种方式
- 原码
- 就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
- 案例:通过一个字节,也就是8个二进制位表示+7和-7
- 00000111(+7)
- 10000111(-7)
- 将案例的两个二进制码相加,结果为10001110,不等于0,这与(+7)+(-7)=0,矛盾,所以,计算机里使用的是补码,而非原码,而要了解补码,首先必须知道反码。
- 反码
- 正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
- 补码
- 正数的补码与其原码相同;负数的补码是在其反码的末位加1。
- 案例: 通过一个字节,也就是8个二进制位以补码的形式表示+7和-7
- 反码:
- 00000111(+7)
- 11111000(-7)
- 补码
- 00000111(+7)
- 11111001(-7)
- 反码:
- 将案例的两个二进制以补码形式相加,结果为100000000,最多只能装八位,所以把“1”去掉,结果为00000000,符合实际。
- 原码
02.05_变量的概述及格式
-
A:什么是变量
- 在程序执行的过程中,在某个范围内其值可以发生改变的量。
-
B:变量的定义格式
- 数据类型 变量名=变量值
-
C:为什么要定义变量
- 用来不断存放同一类型的常量,并可以重复使用。
02.06_数据类型的概述和分类
- A:为什么有数据类型
- Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
- B:Java中数据类型的分类
- 基本数据类型
- 引用数据类型
- C:基本数据类型分类(4类8种)
- 整数型
- byte 占 一个字节 -128到127
- short 占两个字节 -215到215-1
- int 占四个字节 -231到231-1
- long 占八个字节 -263到263-1
- 浮点型
- float 占四个字节
- double 占八个字节
- 字符型
- char 占两个字节 0到65535
- 布尔型
- boolean
- boolean理论上占八分之一个字节,因为一个开关就可以决定是true和false,但是java中的布尔类型没有明确指定它的大小。
- boolean
- 整数型
02.07_定义不同数据类型的变量
- A:案例演示
class Demo1_DataType {
public static void main(String[] args) {
//整数类型
byte b = 10; //占一个字节
short s = 20; //占两个字节
int i = 30; //占四个字节 整数默认的数据类型就是int类型
long x = 88888888888L; //占八个字节 当定义的值查过int范围时,则必须在数字后加L(大小写均可),
// 但最好加大L,因为小l太像1了
System.out.println(b);
System.out.println(s);
System.out.println(i);
System.out.println(x);
//浮点类型
float f = 12.3F; //占四个字节 float类型必须加F(大小写均可)
double d = 33.4; //占八个字节 小数默认的数据类型是double
System.out.println(f);
System.out.println(d);
//字符类型
char c = 'a'; //占两个字节
System.out.println(c);
//布尔类型
boolean b1 = true;
boolean b2 = false;
System.out.println(b1);
System.out.println(b2);
}
}
- B:赋值时注意float类型和long类型
- C:使用变量的注意事项
- 作用域问题
- 同一个区域不能使用相同的变量名
- 初始化问题
- 局部变量在使用之前必须赋值
- 一条语句可以定义几个变量
- int a,b,c…;
- 作用域问题
02.08_数据类型转换之隐式转换
-
A:案例演示
- byte + int 的结果
class Demo1_DataTypeConversion { public static void main(String[] args) { //数据类型之隐式转换 int x = 3; byte b = 4; x = x + b; System.out.println(x); } }
-
B:解释byte+int类型的问题
- 案例中的结果为int类型。原理如下图,
- 案例中的结果为int类型。原理如下图,
-
C:Java中的默认转换规则
- 小数据类型转向大数据类型
02.09_数据类型转换之强制转换
- A:案例分析
- 有如下程序段
class Demo1_DataTypeConversion { public static void main(String[] args) { //数据类型之隐式转换 //int x = 3; //byte b = 4; //x = x + b; //System.out.println(x); // int x = 3; byte b = 4; b = x + b; System.out.println(b); } }
发现运行结果错误。这是因为x+b为int类型,而b为byte类型,所以从int类型转向byte类型会损失精度,因而程序报错。而上述结果为7,显然在byte类型的数据范围内,所以用byte类型能够节约内存。这里就要用到数据的强制类型转换。
-
B:强制转换格式
- b = (byte)(x + b);
- 它的实质,就是把int类型前三个8位给丢掉,强制变成一个字节的byte类型。
- 程序段
class Demo1_DataTypeConversion { public static void main(String[] args) { //数据类型之隐式转换 //int x = 3; //byte b = 4; //x = x + b; //System.out.println(x); //数据类型之强制转换 int x = 3; byte b = 4; b = (byte)(x + b); System.out.println(b); } }
-
C:强制转换的注意事项
- 如果超出了被赋值的数据类型的取值范围,得到的结果会与你期望的不同。
- 程序段
class Demo1_DataTypeConversion { public static void main(String[] args) { //数据类型之隐式转换 //int x = 3; //byte b = 4; //x = x + b; //System.out.println(x); //数据类型之强制转换 //int x = 3; //byte b = 4; //b = (byte)(x + b); //System.out.println(b); //强制类型转换需注意的问题 //0000000 00000000 00000000 10000010 130的二进制 //10000010 丢去前三个8位,得到的其实是-126补码 //10000001 -126反码 //11111110 -126原码 byte b = (byte)(126+4); System.out.println(b); } }
上述程序段结果等于-126的实质是,byte类型的范围时-128到127,所以130超出了其范围,那么当期强制转换成byte类型的时候,对前三个8位的丢弃是不合理,这也造成了130变成了-126。
02.10_数据类型转换面试题
- A:案例演示1——变量相加
class Test1_DataTypeConversion {
public static void main(String[] args) {
//面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
/*
从两个方面
1.byte和byte(或short,char)进行运算的时候会提升为int,
两个int类型相加的结果也是int类型
2.b1和b2是两个变量,变量存储的值是变化的,在编译的时候无法判断里面具体的值,
相加有可能会超出byte的取值范围
*/
System.out.println(b3);
}
}
- B:案例演示2——常量相加
class Test1_DataTypeConversion {
public static void main(String[] args) {
byte b4 = 3 + 4; //3和4都是常量,java里有常量优化机制,
//就是在编译的时候直接把3和4相加的结果赋值给b4了,即相当于byte b4 = 7;
System.out.println(b4);
}
}
02.11_long与float的取值范围谁大谁小
- A:进行混合运算的时候,byte,short,char不会相互转换,都会自动提升为int类型,其他类型进行混合运算时是小的数据类型提升为大的
- byte,short,char——int——long——float——double
- B:float表示的数据范围
- float占4个字节,32个二进制位,并且符合IEEE 754规定
- IEEE 754规定
- 1位是符号位
- 8位代表指数位
- 00000000到1111111
- 0到255
- 并规定,0代表0,255代表无穷大
- 剩下的范围为1到254,同时规定该范围减去127,得到-126到127
- 23位代表小数位
- C:总结
- 它们的底层的存储结构不同
- float表示的数据范围比long的范围要大
02.12_字符和字符串参与运算
- A:案例演示——字符与ASCII码表
public class Demo4_DataTypeConversion {
public static void main(String[] args) {
System.out.println('a' + 1); //98,因为有ASCII码表,a字符对应的是int类型的97
System.out.println((char)('a' + 1)); //b,强制类型转换,从int类型转到char类型
}
}
* 记住三个值
* '0' 48
* 'A' 65
* 'a' 97
- C:案例演示——不同类型的数据与字符串相加
public class Demo4_DataTypeConversion {
public static void main(String[] args) {
//System.out.println('a' + 1); //98,因为有ASCII码表,a字符对应的是int类型的97
//System.out.println((char)('a' + 1)); //b,强制类型转换,从int类型转到char类型
System.out.println("hello" + 'a' + 1); //helloa1,任何数据类型用+与字符串相连接都会产生新的字符串
System.out.println('a' + 1 + "hello"); //98hello
System.out.println("5 + 5 =" + 5 + 5); //5 + 5 = 55
System.out.println("5 + 5 =" + (5 + 5)); //5 + 5 = 10,用括号改变优先级
}
}
02.13_char数据类型
- A:程序段
class Demo5_Char {
public static void main(String[] args) {
char c = 'a';
System.out.println(c);
char c1 = 97; //0-65535之间,通过ASCII码表转换成对应字符
System.out.println(c1); //a
//char类型是否可以存储中文
char c2 = '中'; //可以输出单个中文,因为java采用了Unicode编码,
//Unicode编码中每个字符占两个字节,而中文也占两个字节
System.out.println(c2);
}
}
- B:char c = 97; //0-65535
- C:Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
- 可以,因为Java语言采用的是Unicode编码。Unicode编码中每个字符占用两个字节,而中文也占用两个字节
- 所以,Java中的字符可以存储一个中文汉字。
02.14_算术运算符的基本用法
-
A:什么是运算符
- 就是对各种常量和变量进行操作的符号。
-
B:运算符分类
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三目运算符
-
C:算术运算符有哪些?
- +,-,*,/,%,++,–
-
D:注意事项
- +号在java中有三种作用,代表正号,做加法运算,字符串的连接符
- 整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点类型
- /获取的是除法操作的商,%获取的是除法操作的余数
- %运算符
- 当左边的绝对值小于右边的绝对值时,结果为左边
- 当左边的绝对值等于右边或是右边的倍数时,结果为0
- 当左边的绝对值大于右边的绝对值时,结果是余数
- %运算符结果的符号只和左边有关系,与右边无关
- 任何正整数%2的结果不是0就是1,可以用来当作切换条件
- 程序段
class Demo1_Operator { public static void main(String[] args) { System.out.println(10 / 3); //3,整数相除结果只能是整数 System.out.println(10 / 3.0); //3.33。。。,如果想得到小数,把其中一个变成小数,另一个数在运算时会自动类型提升 System.out.println(13 % -5); //3%运算符,符号只与左边的数符号有关 System.out.println(-13 % -5); //-3 } }
02.15_算术运算符++和–的用法
- A:++,–运算符的作用
- 自加(++)自减(–)运算
- ++:自加。对原有数据进行+1
- –:自减。对原有数据进行-1
- B:案例演示
- 单独使用
- 放在操作数的前面和后面效果一样(较为常见)
- 参与运算使用
- 放在操作数的前面,先自增或者自减,然后参与运算
- 放在操作数的后面,先参与运算,再自增或者自减
- 程序段
class Demo2_Operator { public static void main(String[] args) { //单独使用 int a = 3; //a++; //a = a + 1 ++a; //a = a + 1 System.out.println(a); //4 //参与运算使用 int b1 = 3; int b2 = 3; int c1,c2; c1 = b1++; //当++在变量后面的时候,会现将变量中的值取出做赋值操作,然后再自身加1 c2 = ++b2; //当++在变量前面的时候,会先自身加1,然后再将结果赋值 System.out.println("b1 = " + b1); //b1 = 4 System.out.println("c1 = " + c1); //c1 = 3 System.out.println("b2 = " + b2); //b2 = 4 System.out.println("c2 = " + c2); //c2 = 4 } }
- 单独使用
02.16_算术运算符++和–的练习
- A:案例演示
class Test1_Operator {
public static void main(String[] args) {
int a = 10;
int b = 10;
int c = 10;
a = b++; //a = 10,b = 11
c = --a; //a = 9,c = 9
b = ++a; //a = 10,b = 10
a = c--; //a = 9,c = 8
System.out.println("a = "+ a +",b = "+ b +",c = " + c); //a = 9,b = 10,c = 8
}
}
- B:案例演示
class Test1_Operator {
public static void main(String[] args) {
int x = 4;
// 4 + 6 + 60
// (先取值) (先自增)
int y = (x++) + (++x) + (x*10);
System.out.println("x = " + x + ",y = " + y); //x = 6,y = 70
}
}
- C:面试题
- byte b = 10;
- b++;
- b = b + 1;
- 问哪句会报错,为什么?
- 程序段
class Test1_Operator { public static void main(String[] args) { byte b = 10; b++; //底层上实际已经做了强制转换,即b = (byte)(b + 1) //b = b + 1; //出错,因为int向byte转的时候会损失精度 System.out.println("b = " + b); } }
02.17_赋值运算符的基本用法
- A:赋值运算符有哪些
- 基本的赋值运算符:=
- 把等号右边的数据赋值给左边
- 扩展的赋值运算符:+=,-=,*=,/=,%=
- += 把左边和右边做加法,然后赋值给左边
- 基本的赋值运算符:=
- B:面试题
- 看下面的程序是否有问题,如果有问题,请指出并说明理由
- short s = 1; s = s + 1;
- short s = 1;s += 1;
- 程序段
class Test1_Operator { public static void main(String[] args) { //short s = 1;s = s + 1; //会报错,int往short转回损失精度 short s = 1;s += 1; //底层实现的时候加了强制转换符,s = (short)(s + 1) System.out.println(s); } }
- 看下面的程序是否有问题,如果有问题,请指出并说明理由
02.18_关系运算符的基本用法及其注意事项
- A:关系运算符有哪些(比较运算符,条件运算符)
- ==,!=,>,>=,<,<=
- B:注意事项
- 无论你的操作是简单还是复杂,结果都是boolean类型。
- “==” 不能写成"="