变量
(1)在程序的运行过程中,其值在指定范围内变化的值
(2)是内存中一个区域,用于存储数据
(3)变量的定义格式:
A:数据类型 变量名 = 初始化值;
(4)变量在使用的时候
A:第一种,在声明的时候,就初始化值
**数据类型 变量名 = 初始化值;
B:第二种 在使用前,赋值
**声明
**赋值
**使用
数据类型
(1)java语言分为两种数据类型
A:基本数据类型
B:引用数据类型(类,接口,数组)
(2)基本数据类型
A:区别 在内存中分配的空间大小不同,从而导致它表示的数据范围不同
B:4类8种
**整数
***byte 占1个字节//8个开关,8个二进制位
***short 占2个字节
***int 占4个字节
***long 占8个字节 其后加L或l标识
**浮点数
***float 占4个字节 其后加F或f标识3.3f
//32个二进制位
//1位符号位
//8位代表指数位
//23位尾数位
***double 占8个字节
**字符
***char 占2个字节
**布尔型
***boolean This data type represents one bit of information,
***but its "size" isn't something that's precisely defined.
***这个数据类型代表一个比特的信息,但它的“大小”不是精确定义的东西.
***true,false
C:默认情况下:
**整数是int类型
**浮点数是double类型
(3)数据参与运算
A:整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则
**容量小的类型与容量大的类型进行计算,默认转换为容量大的数据类型;数据类型按容量大小排序为:
***byte,short,char->int->long->float->double
***byte 和 short不能和char之间互相转换,byte可以直接赋值给short,但是他们三者在计算时首先会转 换为int类型
**容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注 意。
**有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,
然后再进行计算。
B:强制转换符
**格式:(数据类型)(要被转换的数据) byte b = (byte)(130);
C:字符型参与运算
**首先会去找对应字符的unicode码值。然后运算。
**char 类型取值范围0~2(16)-1,我就有了一个问题?能不能把整数直接赋值给char类型的变量
D:布尔型参与运算char ch = 10;byte b = 10;char ch = '';
**不能参与运算
E:字符串参与运算
**它是和参与运算的数据相连接组成了一个新的字符串。
**因为有了这个特性,所以我们求出了我们名字的字符值就可以在内存中这样输出
**System.out.println(""+'\u51AF'+'\u4F73');输出的结果就是我的名字
运算符
(1)算术运算符 +,-,*,/,%,++,--
A:%
**当左边的绝对值小于右边:结果是左边
**当左边的绝对值等于右边或者是右边倍数的时候:结果是0
**当左边的绝对值大于右边:结果是余数,符号取决与左边的的符号
**取余的正负号取决于左边,右边忽略不记
**用途:任意正整数%2 结果是要么0,要么1。用于切换条件
B:++,--
int a = 3;
int b = a++;
System.out.println(a);
**递增,递减运算符。就是加1或者减1
**单独存在,放在操作数的前面或者后面,结果一样
**参与运算时:
***放在操作数的前面,先自身加或者减1,然后再参与运算
***放在操作数的后面,先参与运算,然后再自身加或者减1
C:+
**作为数据的符号(正号)
**做加法运算
**字符串连接符"5 + 5 =" + (5 + 5);
(2)赋值运算符
A:=:赋值运算符 把右边的值赋给左边
B:+=:加赋值运算符 把左边和右边的和赋给左边
(3)比较运算符
A:==,!=,>,<,>=,<=
B:比较运算符的结果都是boolean型,也就是要么是true,要么是false。
(4)逻辑运算符
逻辑与运算符 &
第一个条件 第二个条件 结果
true true true
false true false
true false false
false false false
简单记:左右两边同时为true,结果为true。
逻辑或运算符 |
第一个条件 第二个条件 结果
true true true
false true true
true false true
false false false
简单记:左右两边只要有一个结果是true,结果为true。
逻辑异或运算符 ^
第一个条件 第二个条件 结果
true true false
false true true
true false true
false false false
简单记:左右两边相同,结果为false。
逻辑非运算符 !
!true false
!false true
!!true true
短路与:
&:左边无论什么结果,右边都执行。
&&:左边为false,右边不执行,结果为false。
短路或:
|:左边无论什么结果,右边都执行。
||:左边为true,右边不执行,结果为true。
(5)位运算符2<<3
<<一个正整数向左移动几位就乘以2的几次幂
>>一个正整数向右移动几位就除以2的几次幂,高位是0就补0,高位是1就补1
>>>无符号右移无论最高位的符号位是0还是1,用无符号右移后高位符号位都是补0
(6)三元运算符
A :(条件表达式)?表达式1:表达式2;
**如果条件为true,运算后的结果是表达式1;
**如果条件为false,运算后的结果是表达式2;
B:条件运算符运算完之后一定有一个结果
int x,y,z;
x = 5;
y = 10;
z = (x > y) ? x : y;
判断结构
三种格式:
第一种:if(条件表达式){
执行语句;
}
System.out.println();
第二种:if(条件表达式){ //if else和三元运算符的区别
执行语句; //三元运算符是一个运算符号,ifelse是一个语句
}else{ //三元运算符运算后必须有结果,而且不能有语句
//ifelse可以没有结果,可以有语句
执行语句;
}
第三种:if(条件表达式){
执行语句;
}else if (条件表达式){
执行语句;
}else{
执行语句;
}
2:switch
格式:
int x = 10;
switch (表达式){//byte,short,int,char,String 枚举
case 表达式里对应的值:
执行语句;
//break;
case 表达式里对应的值:
执行语句;
break;
......
default:
执行语句;
break;//最后一句的break可写可不写,因为程序已经执行到了末尾
}
重点:switch 结束只有两种情况
1,当程序执行过程中遇到了break
2,当程序执行到了末尾处
应用 switch需要注意的两个细节
1,当switch表达式的值与其中一个case匹配的时候,这个case里没有写break;语句,那么程序会继续执行下个case里
的执行语句,不会再对case值进行判断,应用于当几个case里的值所要执行的语句都一样的时候,我们可以不写break
2,当我们把 default 不是写在最后,default 里面还没有写break的是时候,switch里的表达式与各个case里
的值都不匹配的时候,上面两个条件同时满足的话,程序在default里执行完了还会再去执行case里的语句
3:
(1)while循环
格式:
while (条件表达式){
循环体;
控制循环次数;
}
(2)do while 循环
格式:
do{
循环体;
控制循环次数
}
while (条件表达式);
while和do while的区别:
dowhile语句会先执行循环体,再去判断条件,也就是说无论条件是否满足他都至少要执行一次循环体,先执行
再判断
while 先判断条件,只要条件不满足就不在执行循环体了,先判断,再执行.
(3)for
格式:
for(初始化表达式1;循环条件表达式2;循环后的操作表达式4){
执行语句;(循环体)3
}
(4)for 的嵌套循环,建议做题的时候就弄个双层嵌套就可以,不要弄太多层,影响效率
格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式){//这是外层循环
执行语句;(循环体)
//下面是内存循环
for(初始化表达式;循环条件表达式;循环后的操作表达式){
执行语句;(循环体)
}
}
4:continue和break
a,这两个语句离开应用范围,存在是没有意义的。
b,这两个语句单独存在下面都不可以有语句,因为执行不到。
c,continue语句是结束本次循环继续下次循环。
d,标号的出现,可以让这两个语句作用于指定的范围。
语句的最后总结
A:当对某几个值进行判断的时候,可以使用if语句,或者switch语句。
建议使用switch。但是,使用switch要注意,它只能操作六种类型的值,byte,short,int,char,String,枚举。
如果是六种以外的值,需要使用if。
B:如果对数据区间进行判断,或者对运算结果是boolean类型的进行判断,用if语句。
C:当需要某些语句执行很多次的时候,使用循环结构。如果定义变量只为循环增量存在时,可以使用for语句。
如果对一个条件进行一次判断使用if,如果对该条件进行多次判断,使用while
D:如果要结束循环,可以控制循环条件,或者通过break语句完成。
如果要控制循环的流程,是否该继续执行,可以通过continue或者break来完成。
E:break结束当前所在循环。continue结束本次循环,进入下一次循环。
函数
(1)函数就是定义在类中的具有特定功能的一段独立小程序。函数也称为方法。
(2)函数的格式 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) {
执行语句;
return 返回值;
}
public static int add(int a,int b)//a =3,b =5
A:修饰符 后面会重点讲。public static
B:返回值类型 这个特定的功能完成后,需要返回一个结果。这个地方就是返回结果的类型。
C:函数名 为了方便使用这个函数,给它起个名字。这个名字要符合标识符命名规则。
D:参数类型 形式参数的数据类型
**:形式参数 自定义的接收方
**:实际参数 发出方add(3,5)
E:执行语句 那么这个语句是由多条语句组成。
F:return 这个功能执行完以后,需要有一个返回值,那么这个值有关键字return带回。
(3)函数的特点
A:一般函数只有被调用后,才执行。
B:void 表示没有返回。在这个函数的结尾可以不写return。
**其实jvm会自动的结尾处加上return;
(4)如果定义自己的函数 两个明确
A:明确该功能的结果 其实就是该功能的返回类型。
B:明确该功能的参数 其实就是明确该功能中是否需要未知内容(形式参数)参与运算。明确未知内容的类型和个数。
(5)函数的重载
A:函数名相同,参数列表不同。
**参数类型不同。int add(int i) void add(double d)
**参数个数不同。add(int a,int b);add(int a,int b,int c)
**参数顺序不同 print(String name, int age) //参数顺序不同的重载是可以存在的,但是没有什么实际义
print(int age,String name)
B:特点:与返回值类型无关,只看参数列表。
C:好处:便于阅读,优化程序设计。
数组
(1)同一种类型数据的集合。其实数组就是一个容器。 int[] arr = new int[5];
A:只要是容器,就得重点掌握。
(2)数组的好处
int[] arr = new int[5];
arr[3] = 10;
A:可以自动给数组中的元素从0开始编号,方便操作这些元素。
(3)数组的定义格式
A:当不明确数组中的元素时
**举例 int[] arr = new int[3];//动态初始化
arr[0] = 3;
B:当明确数组中的元素时
**举例 int[] arr = new int[]{1,2,3,4,5};//静态初始化
int[] arr = {1,2,3,4,5};
(4)什么时候使用数组?
A:当要操作的同种数据类型的数据是多个的时候,你就得想着先把这些数据用数组进行存储。
(5)内存图
A:栈
**存储的是局部变量(在函数中定义的变量)。
**变量被使用完后,立即自动释放。
B:堆
**存储的是实体(数组和对象)。
**实体:new出来的东西,可以存放很多数据的东西。
***class定义一个类。
**堆内存数据的特点
***每个实体都有内存地址
***堆内存中的变量都有默认初始化值
****int --> 0
****double --> 0.0
****boolean --> false
****char --> '\u0000' 空字符,unicode编码。
***当实体不在被使用的时候,会在jvm空闲的时候,
通过java垃圾回收机制使其自动释放。
C:方法区 后面讲。
D:本地方法区 调用是Windows系统底层资源,我们不用考虑。
E:寄存器 和CPU相关。我们不用考虑。
(6)操作数组最常见的问题
A:当你访问到数组中的最后一个元素时,还想继续访问,这个时候,会发生角标越界异常。
**ArrayIndexOutOfBoundsException
**举例 int[] arr = new int[3];
System.out.println(arr[3]);
B:当数组不在指向某个实体时,你还继续访问,就会发生空指针异常。
**NullPointerException
**举例 int[] arr = new int[3];
arr = null;
System.out.println(arr[1]);
(7)常见的数组的操作
记住:对数组的操作,一定要从角标入手。
A:遍历操作
B:获取最值
C:排序(选择和冒泡)
D:传递参数
数组初始化过程
<1> 主函数进栈,然后在main()中有一个数组的引用arr
<2> 在堆内存中开辟空间,分配内存地址值
<3> 在堆内存中建立数组对象,并进行默认初始化
<4> 如果有显示初始化值的,对它进行显示初始化
<5> 将内存地址赋给栈内存中的arr变量