JAVA初步学习——第三章 操作符、流程控制

一、 变量

(1)变量的作用:

  1. 程序中使用变量可以接收、保存、传递、操作数据
  2. 变量的类型和数据的类型必须是一致的
  3. 如果类型不一致,那么就需要进行类型转换(自动转换、手动转换)

(2)变量的使用:

  1. 必须是先声明、再赋值、再使用
  2. 也可以声明变量的同时就进行赋值,然后再使用
  3. 如果只声明变量,没有赋值,那么再使用的时候会报错

(3)变量的种类:

  1. 通过类型划分
  • 基本类型变量(byte short int long float double char boolean)
  • 引用类型变量(类类型、接口类型、数组类型)
  1. 通过范围划分
  • 局部变量 ——定义在方法中的变量,就是局部变量
  • 实例变量 ——实例变量就是类中的属性,也叫做成员变量(非静态的)

1. 局部变量

public void test(){ 
    //int类型的变量a,同时也是一个局部变量 
    int a = 1; 
}

局部变量没有默认值

局部变量的作用范围

  • 变量都是有作用范围的,超出这个范围,变量就不能使用了
  • 局部变量被直接包裹的大括号中,从这变量声明开始,一直到这个大括号结束

注意,方法的参数,也是局部变量,它的作用范围在整个方法

2. 实例变量

public class Student{ 
    public String name; 
    public int age; 
    public void print(){ 
        System.out.println(name);//可以使用,成员变量有默认值 
        System.out.println(age);//可以使用,成员变量有默认值 
        } 
}

实例变量是默认值的,即使声明完,不赋值,它也是有一个默认的值

不同类型的实例变量,它们的默认值是

  • byte类型,默认值为0
  • short类型,默认值为0
  • int类型,默认值为0
  • long类型,默认值为0L
  • float类型,默认值为0.0F
  • double类型,默认值为0.0D
  • boolean类型,默认值false
  • char类型,默认值是’\u0000’
  • 引用类型,默认值是null

注意:实例变量的作用范围是当前类中所有的非静态方法中,都可以访问。

二、操作符

1.赋值操作符

操作符作用例子
=最基础的赋值操作符,=号右边的值,赋给=号左边变量int a = 1; int x = 0;
*=一个变量和另一个数据相乘,并把结果再赋值给这个变量int a = 1; a*=2; //a = a*2;
/=一个变量和另一个数据相除,并把结果再赋值给这个变量int a = 2; a/=2; //a = a/2;
%=一个变量和另一个数据相余,并把结果再赋值给这个变量int a = 5; a%=2; //a = a%2;
+=一个变量和另一个数据相加,并把结果再赋值给这个变量int a = 5; a+=2; //a = a+2;
-=一个变量和另一个数据相减,并把结果再赋值给这个变量int a = 5; a-=2; //a = a-2;

a++ 和 ++a 的区别:(a-- 和 --a的区别与之类似)

  • a++ 表示先使用a的值进行操作或者运算,然后再让a完成自增1
int a = 1; 
int b = a++; 
System.out.println(a);//输出 2 
System.out.println(b);//输出 1
  • ++a 表示先让a完成自增1,然后再使用a的值进行操作或者运算
int a = 1; 
int b = ++a; 
System.out.println(a);//输出 2 
System.out.println(b);//输出 2

2.比较操作符

操作符作用例子
>比较是否大于1>0
>=比较是否大于等于1>=0
<比较是否小于1<2
<=比较是否小于等于1<=2
instanceof判断对象是否属于指定类型stu instanceof Student

3.相等操作符

操作符作用例子
==比较两边的数据是否相等,相等返回true,不相等返回false1==2,o1 == o2
!=比较两边的数据是否不相等,相等返回false,不相等返回true1!=2,o1!=o2

可以用在俩个数字之间的判断,也可以用俩个对象之间的判断。

4.算术操作符

操作符作用例子
+数字之间使用+,表示俩个值相加int a = 1+1;
-两个数字相减int a = 1-1;
*两个数字相乘int a = 1*1;
/两个数字相除int a = 1/1;
%两个数字取余int a = 5%2;

注意“”使用+号,也可以连接(拼接)俩个字符串,数值也可以和字符串使用+号连接,连接之后的结果还是字符串

5.移位操作符

操作符作用例子
>>算术右移位运算,也叫做【带】符号的右移运算8 >> 1
<<左移位运算8 << 1
>>>逻辑右移位运算,也叫做【不带】符号的右移运算8 >>> 1

(1)>> 算术右移位运算
这个操作的本质就是除以2n,这个n就是我们右移的位数

  • 除以2n之后,只保留整数部分
  • 正数右移之后,最左边空出的位置,都要补0
  • 负数右移之后,最左边空出的位置,都要补1

(2)<< 左移位运算
这个操作的本质就是乘以2n这个n就是我们左移的位数

  • 无论正数负数左移之后,最右边空出的位置,都要补0
  • 当左移之后,得到的数字已经超出当前类型所能表示的最大值的时候,这个值最终会被限定到这个当前类型中,所以最终显示的值会和我们逻辑上算出的值有所不同。

(3)>>> 逻辑右移位运算,也叫做【不带】符号的右移运算
这个操作的本质就是除以2n,这个n就是我们右移的位数

  • 除以2n之后,只保留整数部分
  • 正数和负数右移之后,最左边空出的位置,都要补0

在操作的时候,java操作的都是计算机中的补码

  • 正数的原码、反码、补码都是一样的
    例如:数字1的原码0000 0001,反码0000 0001,补码0000 0001
  • 负数的原码、反码、补码有所不同
    例如:数字-1
    原码:1000 0001
    反码:1111 1110 除了符号位之外,其他按位取反
    补码:1111 1111 反码基础上加1

6.位运算符

操作符作用例子
&与运算1&1=1,1&0=0, 0&1=0, 0&0=0
|或运算1|1=1,1|0=1,0|1=1,0|0=0
^异或运算1^1=0, 0^0=0, 1^0=1, 0^1=1,相同为0,不同为1
~取反运算0 -> 1 ,1 -> 0

7.逻辑运算符

(1)&& 短路与

int a = 1; 
int b = 5; 
boolean result; 

1.第一个结果是false
// a>4 这布尔表达式为false,之后的(b++)>1就不需要计算了 
// 因为当前是短路与(&&)运算,第一个false已经能够决定整个表达式的结果了 
result = a>4 && (b++)>1; 
System.out.println(result);//false 
System.out.println(b);//输出5 

2.第一个结果为true
// 这种情况下,a>0为true,必须要再进行后面表达式的计算,最终才能得到结果,所以要计算后的(b++)>1的部分 
result = a>0 && (b++)>1; 
System.out.println(result);//true 
System.out.println(b);//输出6

& 和 && 的区别
&既可以作为二进制数字的位运算符,也可以作为布尔表达式中的逻辑运算符,但是作为逻辑运算符的时候,&并没有&&符合的那种短路的功能。
&& 只能作为逻辑运算符,但是它会具备短路的功能。

(2)|| 短路或,和上面&&的操作类似
||的逻辑是:第一个布尔表达式为true,才能决定整个表达式的结果

8.条件操作符(三目运算符)

语法:
boolean表达式 ? 表达式1 : 表达式2

int x = 10; 
int y = 5; 
int z; 
z = (x > y) ? x : y;//三目运算符

9.优先级问题

优先级运算符结合性
1()、[]、{}从左向右
2!、+、-、~、++、–从右向左
3*、/、%从左向右
4+、-从左向右
5«、»、>>>从左向右
6<、<=、>、>=、instanceof从左向右
7==、!=从左向右
8&从左向右
9^从左向右
10|从左向右
11&&从左向右
12||从左向右
13?:从右向左
14=、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>=从右向左

三、类型转换

java中的=号赋值操作,需要=号俩边的类型一致,也就是=号右边的数据的类型要和=号左边的变量的类型保持一致,如果不一致,那么就需要做类型的转换,分为隐式转换(自动转换)和显示转换(强制转换/手动转换)。

1.基本类型

(1)隐式转换:一般是数据范围比较小的,自动就可以转换为数据范围比较大的类型(基本类型)。

byte a = 1; 
int b = a; //注意,这里在运行期间,就自动完成了转换的过程

(2)显示转换(简称:强转,有风险):编译器发现类型无法自动转换的情况,就会编译报错,这时候我们确认无误后,就可以进行类型强制转换。

int a = 100; 
//编译报错,因为a是int类型,b是byte 
//把32位int数据,赋值给8位的变量b 
//把一个范围大的数据,赋给一个范围小的变量 
//这时候是不允许的,也无法类型自动转换。 
byte b = a; 

//编译通过,自己手动进行了类型转换 
//对于基本类型,强制转换就是把多余的位给抹去 
//所以这时候可能对数据的值,造成影响 
byte b = (byte)a;

2.引用类型

(1)隐式转换

Student s = new Student(); 
Object o = s;//特点:子类类型的变量,可以自动转为(隐式)父类类型 

//上面俩句代码可以合成这一句代码,其实就是把中间变量s给去掉了。 
Object o = new Student();

(2)显示转换

Object o = new Student(); 
Student s = (Student)o;//特点:父类类型的变量,需要强制转为(显式)子类类型

四、流程控制

程序中,需要执行的代码,其结构主要分为:

  • 顺序结构
  • 分支结构
  • 循环结构

1.if

(1)语法1执行流程:

  • 首先计算关系表达式的值
  • 如果关系表达式的值为true,就执行语句体
  • 如果关系表达式的值为false,则不执行语句体
  • 继续执行if代码块后面的其他代码
int a = 10; 
if(a%2==0){ 
    System.out.println("变量a的值为偶数"); 
}
//其他代码

(2)语法2执行流程:

  • 首先计算关系表达式的值
  • 如果关系表达式的值为true,就执行语句体1
  • 如果关系表达式的值为false,就执行语句体2
  • 继续执行if代码块后面的其他代码

如果if中的代码执行了,那么else的代码就不执行;如果if中的代码没执行,那么else中的代码就会执行。

int a = 10; 
if(a%2==0){ 
    System.out.println("变量a的值为偶数"); 
}else{
    System.out.println("变量a的值为奇数"); 
}

如果有俩个if,第一个if条件无论是true还是false,第二个if条都会继续判断

int a = 10; 
if(a%2==0){ 
    System.out.println("变量a的值为偶数"); 
}
if(a%2==1){ 
    System.out.println("变量a的值为奇数"); 
}

(3)语法3执行流程:

  • 首先计算关系表达式1的值
  • 如果表达式1的值为true,就执行语句体1;如果值为false就计算关系表达式2的值
  • 如果表达式2的值为true,就执行语句体2;如果值为false就计算关系表达式3的值
  • 如果没有任何关系表达式为true,就执行else代码
  • 如果中间有任何一个关系表达式为true,那么执行完对应的代码语句之后,整个if-elseif-else退出

从上到下依次判断,有一个判断为true执行了代码,那么后续判断都不再执行,如果判断都为false,则执行else语句代码

int a = 10; 
if(a>90){ 
    System.out.println("优秀");
}else if(a>80){ 
     System.out.println("良好"); 
}else if(a>70){ 
     System.out.println("中等"); 
}else if(a>60){ 
     System.out.println("及格"); 
}else{
     System.out.println("不及格"); 
 }

2.switch

switch语句和if很类似,都是用来判断值是否相等,但是switch默认只支持byte、short、int、char这四种类型的比较,JDK8中也允许String类型的变量做对比。

语法的执行流程:

  • 首先计算出表达式的值
  • 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,遇到break就会结束switch程序
  • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉

假如mode本次的值是0,那么case 0 这种情况就成立了,然后打印指定语句,再执行break,接着退出整个switch语句。

int mode = 0;//0 1 2 3 
switch(mode){ 
    case 0:{ 
        System.out.println("默认模式开启"); 
        break; 
    }
    case 1:{ 
        System.out.println("手动模式开启"); 
        break; 
     }
     case 2:{ 
         System.out.println("自动模式开启"); 
         break; 
     }
     case 3:{ 
         System.out.println("智能模式开启"); 
         break; 
     }
     default:{ 
         System.out.println("模式选择错误!!"); 
     } 
}

若把这个代码中的break全都去掉了
假设本次mode的值还是0,那么case 0成立之后,现在执行里面的代码, 打印指定语句。
由于这时候没有break,然后代码会继续往下执行,并且不会再做case 1 2 3的判断了,而是直接执 行case 1 2 3中的代码,也包含执行default中的代码,所以最后的输出结果为:
默认模式开启
手动模式开启
自动模式开启
智能模式开启
模式选择错误!!
这种情况,就是因为代码中没有写break的原因。

3.for

描述:

  1. 初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
  2. 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
  3. 循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
  4. 条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去

执行流程:

  • 执行初始化语句
  • 执行条件判断语句,看其结果是true还是false
    • 如果是false,循环结束
    • 如果是true,继续执行
  • 执行循环体语句
  • 执行条件控制语句
  • 回到步骤2继续执行
//求1-5之间的数据和
public class ForTest02 { 
    public static void main(String[] args) { 
    //求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0 
        int sum = 0; 
        //从1开始到5结束的数据,使用循环结构完成
        for(int i=1; i<=5; i++) { 
        //将反复进行的事情写入循环结构内部 
        // 此处反复进行的事情是将数据 i 加到用于保存最终求和的变量 sum 中 
            sum += i; 
            /* 
                sum += i; 
                sum = sum + i; 
                第一次:sum = sum + i = 0 + 1 = 1; 
                第二次:sum = sum + i = 1 + 2 = 3; 
                第三次:sum = sum + i = 3 + 3 = 6; 
                第四次:sum = sum + i = 6 + 4 = 10; 
                第五次:sum = sum + i = 10 + 5 = 15; 
             */ 
         }
             //当循环执行完毕时,将最终数据打印出来 
             System.out.println("1-5之间的数据和是:" + sum); 
         } 
}

4.while

执行流程:

  • 执行初始化语句
  • 执行条件判断语句,看其结果是true还是false
    • 如果是false,循环结束
    • 如果是true,继续执行
  • 执行循环体语句
  • 执行条件控制语句
  • 回到步骤2继续
//循环不断的生成[0,9]随机数,直到生成随机数为5的时候,那么就停止这个循环。
int num = -1; 
while(num!=5){ 
    num = (int)(Math.random()*10); 
    System.out.println("num = "+num); 
}

5.do-while

do-while循环需要先执行循环体中的代码,然后再进行条件判断,是否可以进行一下次循环。

do-while的特点是,无论如何都会先执行一次大括号中的代码

执行流程:

  • 执行初始化语句
  • 执行循环体语句
  • 执行条件控制语句
  • 执行条件判断语句
    • 如果是false,循环结束
    • 如果是true,继续执行
  • 回到步骤2继续
//循环不断的生成[0,9]随机数,直到生成随机数为5的时候,那么就停止这个循环。
int a; 
do{ 
   a = (int)(Math.random()*10); 
   System.out.println("a = "+a); 
}while(a!=5);

6.三种循环的区别

(1)for、while 与 do … while 的区别

  • for和while 先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
  • do…while 先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)

(2)for 与 while 的区别

  • 条件控制语句所控制的自增变量,因为默认情况下归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
  • 条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用

三种循环的使用场景:
1、明确循环次数,推荐使用for
2、不明确循环次数,推荐使用while
3、do…while 很少使用

7.循环嵌套

在一个循环中,可以嵌套另一个循环。
默认情况下,在嵌套循环中,break和continue只能默认对当前循环起作用。

/*

*
**
***
****
*****

*/
for(int i=0;i<5;i++){
    for(int j=0;j<i+1;j++){ 
        System.out.print("*"); //print 方法最后不会自动换行
    }
    System.out.println(); //println方法最后会自动换行
}

五、break与continue

  1. break 的意思是退出,结束当前的循环或switch代码。
//for循环从0到10进行输出,当i的值为5时,跳出当前循环(循环整体结束)
for(int i=0;i<10;i++){ 
    System.out.println("i = "+i); 
    if(i==5){ 
        break; 
    } 
}
  1. continue 的意思是结束本次循环,让循环直接进入一次的运行。
//for循环从0到10进行输出,当i的值为5时,结束本次循环,进入一下次循环
for(int i=0;i<10;i++){ 
    if(i==5){ 
        continue; 
    }
    System.out.println("i = "+i); 
}

六、label

如果想让break或continue在嵌套循环中针对某一个指定的循环起作用,那么可以使用label标签给循环起名字,然后使用break或continue加上循环的名字即可。

test1:for(int i=0;i<3;i++){//外层循环 
    test2:for(int j=0;j<5;j++){//内层循环 
        if(j==2){ 
            break test1; 
        }
        System.out.println("i="+i+",j="+j); 
    }
    System.out.println("----------------------"); 
}

七、Random

Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能

//产生随机数1-10之间的
import java.util.Random; 
public class Demo1Random { 
    /* 
        Random : 产生随机数 
        1. 导包 : import java.util.Random; 
                 导包的动作必须出现在类定义的上面 
        2. 创建对象 : Random r = new Random(); 
                     上面这个格式里面,r 是变量名,可以变,其他的都不允许变 
        3. 获取随机数 : int number = r.nextInt(10); //获取数据的范围:[0,10) 包括0,不包括10 
                      上面这个格式里面,number是变量名,可以变,数字10可以变。其他的都不允许变 
        需求: 产生随机数1-10之间的 
    */
    public static void main(String[] args){ 
        Random r = new Random();
        for(int i = 1; i <= 10; i++){ 
            int num = r.nextInt(10) + 1; // 1-10 
            System.out.println(num); 
        } 
     } 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值