Javase 0714
IDEA
运算符续讲
逻辑运算符: 运算结果是布尔类型
(1):& 并且 只有左右两端同事为true,则最终结果为true;以下为例:
int a=20;
int b=10;
boolean f=a==b&a>b;
System.out.println(f);
(2):| 或者 运算结果任意一段为true,则最终结果为true;
(3):! 取反
(4):^ 异或 相同为false,不同为true;
(5):短路与 短路或 他们在运算结果上没有区别,只是在运算效率有区别 举例:
int a=2;
int b=1;
boolean f=a>b&&b>0;
System.out.println(f);
但同时,&& 运算时左边的为false时,右边就不运算了,当左边为true时,右边的表达式就不运算了。
|| 运算时,当左边为true时,右边就运算了。
位运算符:直接对二进制补码进行运算 & | ^ ~(按位取反) 左移 右移 无符号左右移
System.out.println(3&4) &:有0则0 0
System.out.println(3|4) |:有1则1 7
System.out.println(3^4) ^:相同则0,不同则1 7
System.out.println(~3) -4
3<<2 12
3>>2 正数补0负数补1
数左移相当于数乘2的几次方
数右移相当于除以2的几次方 左右移运算效率高
值交换:
(1):通过中间变量交换int t=a;
a=b;
b=t;
(2):利用^异或特点 一个数异或两次值不变
a=a^b;
b=a^b;
a=a^b;
(3):a=a+b; b=a-b; a=a-b;
(4):a=(a+b)-(b=a);
三元运算符:当表达式的结果为true是,返回结果1 false时,返回结果2
格式:?结果1:结果2:例:a>b?a:b;
语句
顺序结构:写在前面先执行,写在后面后执行
选择结构:代码执行具体逻辑要进行判断
分类:if语句 switch语句
if 语句: if(){}以及多重条件选择
三元表达式能写出来的,if语句能写出来,
if语句能写出来的,三元表达式不一定能写出来
switch 语句:switch(num){
case 10:
break;
case 20:
break;
default:
break;
}
a.支持的数据类型包括: byte short int char String 枚举
b.case后面带匹配的值一定是常量不能是变量
c.多个case值不能有相同的
d.中断 可以不写,可能发生case穿透现象,可以利用,但default 可以不启用
switch 与 if语句的比较
switc针对有限个常量进行选择,不能进行范围选择
if 能对常量选择也能对范围进行选择
语句循环
在Java中,对于重复的语句要使用循环来做
for(int i=0;i<10;i++){}
执行流程如下:
a:执行初始化表达式语句
b:执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
c:执行循环体语句;
d:执行控制条件语句
e:回到B继续。
同时,注意初始化语句只执行一次。
举例说明,用 for 语句输出一千以内的水仙花数
while 格式:
初始化条件语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
执行流程如下:
a:执行初始化条件语句;
b:执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
c:执行循环体语句;
d:执行控制条件语句
e:回到b继续。
do while 格式: 初始化条件语句;
do {
循环体语句;
控制条件语句;
}while(判断条件语句);
执行流程如下:
a:执行初始化条件语句;
b:执行循环体语句;
c:执行控制条件语句;
d:执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
e:回到b继续。
先执行一次循环体,然后再判断循环条件
两者的区别:如果事先知道循环次数用 for 循环,如果不知道循环次数但知道循环结束的条件可以用 while 循环
死循环:循环没有结束条件 for(;;){sout}
while(true){sout}
循环的嵌套: 常见快捷键:10.fori 10.ofrr
举例说明循环嵌套:4、请编写程序,打印出如下图形,并在main方法中调用
1
12
123
1234
12345
代码如下:public static void main(String[] args) {
num();
}
public static void num() {
for (int i = 1; i < 6; i++) {
for (int j = 1; j <=i; j++) {
System.out.print(j);
}
System.out.println();
}
}
值得注意的是:如果有多层循环嵌套,可以直接给循环命名,在内层结束外层循环。例如 wc.for 和 nc.for break.wc
控制跳转语句: 为了弥补在循环执行过程中无法中断一缺陷,Java中提供了 break , continue 和 return来实现控制语句的跳转和中断。
分类: break 中断,在 switch 和循环汇总使用
主要作用为退出单层循环
continue 跳过这一次循环,执行下一步操作
return 跳转到上层方法,在方法中如需要返回主方法调用时,需要返回一个值用
方法
方法:为了解决代码重复编写的问题,也就是完成特定功能的代码块 (在C中称之为函数)
方法的格式:修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2){
方法体;
return 返回值;
}
方法的格式说明:
(a): 修饰符 比较多,后面会详细介绍。目前使用 public static
(b): 返回值类型 用于限定返回值的数据类型
(c): 方法名 就是一个名称,它的存在是为了方便我们调用方法
(d): 参数类型 限定调用方法时传入参数的数据类型
(e): 参数名 是一个变量,接收调用方法时传入的参数 这个参数其实有一个专业的名词,被称之为形式参数,它的作用是用来接收实际参数的.
(f): 方法体 完成功能的代码
(g): return 结束方法以及返回方法指定类型的值
(h): 返回值 就是功能的结果,由return带回,带回给调用者
举例说明:用方法求三个数之和
public static void main(String[] args) {
add(20, 30, 40);
}
public static int add(int x, int y, int z) {
int sum = x + y + z;
System.out.println(sum);
return (sum);
}
注意:如果需要在主方法中调用方法的返回值,是需要明确功能结果的参数类型。
一般的,我们会进行赋值调用和输出调用
方法的调用使用注意事项:
a.方法不调用不执行
b.方法与方法是平级关系,不能嵌套定义
c.方法定义的时候参数之间用逗号隔开
d.如果方法有明确的返回值,一定要由return带回一个值,不用会报错!
再举一例:请编写一个方法,求出1-n之间的偶数和与奇数和的差值,并在main方法中调用
public static void main(String[] args) {
num();
}
public static void num() {
for (int i = 1; i < 6; i++) {
for (int j = 1; j <=i; j++) {
System.out.print(j);
}
System.out.println();
}
}
方法重载:允许一个类中可以定义多个同名方法,只要他们的参数个数或参数类型不同即可。调用时会自动匹配
数组
数组:输组可以看做一个容器,可以用来存储多个同一种数据类型的数据
数组定义格式:
int[]a; 或者 int a[];习惯上使用第一个
注意:数组必须先初始化,才能使用。即在内存中为数组开辟空间,并为数组的元素赋值
初始化:静态初始化和动态初始化
动态:由我们指定的数组长度
int [] arr=new int [5];
静态:由我们赋值,由系统计算长度
int []arr=new int[]{20,30,40,50};
注意:数组的初始化 动态静态二选一
静态数组的简写 double []arr3={3.13,3.13,3.25};
数组可以通过length获得长度:int len=arr.length;
数组在JVM中的实际应用:
在JVM执行程序的过程中会把管理的内存分为以下几个部分:
a.栈:存放局部变量
局部变量:方法定义中或声明中的变量称为局部变量个,形参。
b.堆:存放所有初始化出来的东西
特点:会随机分配一个地址给栈
每个变量根据类型不同会有不同的默认值
举例: byte short int long 0
float boolean 0.0
char '\u0000' 即空格
boolean false
使用完毕会等待被GC回收机处理
c.方法区
d.本地方法区
e.寄存器
以下举例:数组内部元素调换位置:
public static void reverseArr(int[] arr){
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
数组中容易出现的问题:
(1):数组角标越界异常:数组的长度是固定的,定义好就固定了
(2):空指针异常:人为置空,加快回收;