1.变量详解
1.1变量中的数据在计算机中的存储原理
首先我们明白数据在计算机中的存储并不是我们生活中的阿拉伯数字,而是按照二进制编码的形式。
二进制:只有0、1,并且进位按的是逢二进一的方法
在内存中表示数据的最小单位是字节
- 一个字节由8个二进制位组成的(字节,byte)
- 字节中的每个二进制位就成为位(位,bit)
- 1 byte = 8 bit
1.2其他类型的数据存储的方法
前面我们提到了变量中的数据是按照二进制的方式存储的,现在我们来讨论其他数据类型例如:字符、文字、图片是如何存储的
这里给出ASCII码表:
通过观察表格中的信息我们可以知道,一些常用的字符都会有一个编码,这就是ASCII码。
ASCII码:美国信息交换标准编码,规定了现代英语,数字字符和其他西欧字符对应的数字编号
当然,我们也可以在编译器中验证:
public class ASCII {
public static void main(String[] args) {
System.out.println('a' + 10);//107=97 + 10
System.out.println('A' + 10);//75 = 65 + 10
System.out.println('b' + 10);//108 = 98 + 10
}
}
还有中文的存储方式,在这里我们不做深究
图片-彩色图:
- 图片是由无数个像素点组成的
- 每个像素点的数据:用0-225*225*225表示其颜色
声音数据:也是按照类似的方法存储的
2.十进制,二进制,八进制,十六进制之间的转换
- 十进制转换为二进制
- 除2取余法
- 计算法
- 以上面的13为例子:13中包含的2的最大的次方是3,也就是2^3=8,余下5,5包含的最大为2^2,之后余1,即2^0。那我们就得到了2^3、2^2、2^0,那么从上面的说明中可以知道即为1101。
- 除2取余法
- 二进制转换为十进制
- 与上述的十进制转换为二进制的第二种方法一致。简单的计算即可,例如:111001,从最右面开始计算,1*2^0 + 0* 2^1 + 0 * 2^2 + 1 * 2^3 + 1 * 2^4 + 1 * 2^5=57
为了便于观察和表示二进制,推出了八进制和十六进制,现在我们讨论它们的转换关系
- 二进制转换为八进制
- 每三个二进制表示一个八进制位,最小数为0 ,最大数为7,共八个数字
- 二进制转换为十六进制
- 每四个二进制表示一个十六进制位,最小数位0,最大数为F(15),共十六个数字,用0-9、A、B、C、D、E、F表示
- 十六进制和八进制转换为十进制,只需要先转换为二进制再转换为十进制即可
在Java程序中支持书写二进制、八进制、十六进制,只需要分别以0B或0b,0,0X或0x开头即可。
3.数据类型
下面我们进入数据类型的学习,首先我们认知到,在Java中数据类型分为:4大类8种
- int类型和long类型的使用:编译器会默认把输入的整数归为int类型,如果要使用long类型需要在数字的结尾处加上“L / l”
- float类型和double类型的使用:编译器也会默认把输入的小数归结为double类型,如果要使用float类型需要在小数的结尾加上“F / f”
- 引用数据类型:String
- 是用来存储字符串的
4.类型转换
4.1 自动类型转换
- 自动类型转换:范围小的变量可以直接赋值给范围大的变量
- 为什么要进行自动类型转化:我们在编写代码的时候总会进行赋值和传参,自动类型转换可以方便我们进行数据的处理
- 自动类型转换在计算机中的执行原理:
- 其他类型的自动转换
在这里我们再次强调字符在计算机中的存储是按照ASCII码进行的
4.2 表达式的自动类型转换
在表达式中,小范围类型的变量会自动转换为表达式中范围较大的类型,在进行运算。
- 表达式的最终结果类型由表达式中最高类型决定
- 在表达式中,byte、short、char是直接转换为int 类型参与运算的
int i = 10; double sum1 = i + 1.0; System.out.println(sum1); //输出的结果为11.0,double 的范围大于int 所以最终转换为double 的类型进行运算
4.3 强制类型转换
在前面我们知道,小范围类型的变量可以直接赋值给大范围类型的变量。但是我们缺不能把大范围的变量直接赋值给小范围类型的变量。(为了防止小范围类型变量装不下大范围类型变量里面的数据)
为了实现大范围向小范围的转换,提供了强制类型转换的方法
这种方法是把大范围的数据强制转化为其他数据类型,再进行赋值
实际上在计算机中的执行原理:
计算机只会截取强制转换类型所包含的字节长度,上面的转换为byte类型,就是只截取了最右面一个字节的数据。
但是强制类型转换会有很大的弊端:可能会造成数据的丢失
输出的结果是-36,丢失了数据。
注意:11011100是反码,最高位是符号位,在后面会讲到
值得注意的是,浮点型数字在转换为整型的时候会直接丢掉小数部分
5.运算符
5.1 基本的算术运算符,“+”符号做连接符
- 基本算术运算符
- 注意:在两个整型相除的时候,结果都是整型,不会有小数。如果想让结果是小数,除号两端只要有一个是小数就可以
- “+”做连接符
- “+”在和字符串进行运算的时候是作为连接符的,结果依然是一个字符串
- 说明:判断是否“+”是作为连接符的方法:“能算则算,不能算则连接”
- 以上的运算结果是:
在上面第三个运算中,+ 的优先级一样,所以都是从左至右运算,所以是“itheima5”
5.2 自增自减运算符
自增和自减:
自增:++ | 放在变量的前面或者后面,对变量的值加一 |
自减:- - | 放在变量的前面或者后面,对变量的值减一 |
前置和后置自增(自减):自增和自减如果不是单独使用,有其他的操作或再表达式中的时候,放在变量的前面和后面会有明显的区别
这里以自增为例:
前置自增:
先把a的值加一,再把a赋值给rs;
后置自增:
先把b的值赋值给rs,再把b的值加一
注:字面量不可以使用自增和自减操作
这里补充一个运算题目便于理解:
5.3 赋值运算符
在先前我们已经了解过简单的赋值操作“ = ”
在这里我们介绍一些拓展运算符:
在编写代码的时候我们常用的操作是加后赋值和减后赋值,同时应注意在使用上述赋值的时候是隐藏强制类型转换的。
byte a = 30;
byte b = 20;
a = a + b;//这是错误的,在前面我们说过,byte类型的数据在进行运算的时候会先转换为int类型
a += b;//是正确的,因为和 a = (byte)(a + b);
5.4 关系运算符
- 注意:这些关系运算符的返回值是布尔类型,在选择和循环语句中经常会用到
- 注意赋值和判断相等的区别
- <= 和>= 都是便是或者 的意思,比如:2<=2,成立,因为2=2或者2< 2 满足其一表达式成立
5.5 逻辑运算符
在表达式中上述运算符的返回结果同样是布尔类型的值,这里我们着重说一下逻辑异或
public static void main(String[] args) {
System.out.println(true ^ false);//true
System.out.println(false ^ true);//true
System.out.println(true ^ true);//false
System.out.println(false ^ false);//false
}
下面我们补充两个重要的运算符:短路与、短路或
- 从代码的时间效率来讲,&&和|| 的效率更高,同时注意前面的&和| 在执行代码的时候是两边都要执行的
- 但是值得注意的是:在我们使用&&和|| 的时候需要注意右边的代码是否执行,判断右边变量或表达式的运算情况
5.6 三元运算符,运算符的优先级
- 三元运算符
- 格式:表达式 ?值1 :值2
- 如果表达式的值为真,就返回值1,如果值为假就返回值2
- 下面给一些例子
-
//求两个数中的最大/最小值 int a = 10; int b = 20; int max = a > b ? a : b;
-
//返回字符串的形式 double sor = 88.2; string = sor <= 100 ? "次品" : "正品";
-
-
运算符的优先级
- 在一个复杂的表达式中,往往有很多的运算符,并且变量通常在多个运算符中,所以需要我们了解运算符的优先级
- 优先级表示在表达式中的运算顺序,优先级高的运算符先进行计算
- 结合性分为左结合性和右结合性,左结合性表示从左向右进行运算,右结合性表示从右向左进行运算;在Java中大多是运算符符合左结合性。
6.在Java封装好的程序
先前我们已经了解过了JDK的结构:
其中的API就是封装好的程序,在进行一些简单的操作的时候我们可以直接使用其中的程序
并且Java提供给我们了程序使用说明书(API文档),可以在Oracle官网下载
在这里我们简单介绍输入程序scanner的调用: