JavaSE之变量、数据类型、运算符、流程控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_1018944104/article/details/82735235

目录

一、变量

1.什么是变量?

2.语法格式

3.Java中变量的特点(Java是强数据类型的语言)

4.使用注意

5.Java标识符命名规则及规范

6.两个变量交换值的算法

二、数据类型

1.分类

2.基本数据类型对比

3.类型转换

三、运算符

1.运算符的分类

2.算法运算符:+  -  *  /  %

3.关系运算符

4.逻辑运算符

5.赋值运算符(==)

6.条件运算符(? :)

7.位运算符

8.运算符的优先级

四、流程控制

1.控制语句分类

2.流程图

3.条件语句

4.循环语句

5.跳转语句

五、补充知识

1.注释

2.print( ) 和 println( ) 的区别

3.转义字符

4.控制台输入

5.格式控制


一、变量

1.什么是变量?

  • 内存中的一块存储空间,是存储数据的容器且只能存一个值,因为存在在其中的数据可以改变所以称之为变量。

2.语法格式

  • 数据类型  变量名;比如 int  age;
  • 其中变量名时内存空间的地址名,数据类型可以是基本数据类型也可以是引用数据类型。

3.Java中变量的特点(Java是强数据类型的语言)

  • 先声明变量类型,再赋值,且赋值的类型一定与声明的类型要一致。

4.使用注意

  • 同一作用域内,变量不能重名;
  • 局部变量必须初始化后才能使用,否则编译报错。

5.Java标识符命名规则及规范

规则

  • 由字母、数字、下划线或$符组成;
  • 首位不能使用数字;
  • 不能使用Java的关键字;
  • 不能是用字面值,比如true,false,null。

规范

  • 驼峰法则

6.两个变量交换值的算法

三种方法:引入中间变量,加减取值法,异或取值法

int a = 1;
int b = 2;
//方法一:引入中间变量
int temp = a;
a = b;
b = temp;
//方法二:加减取值法
a = a + b;
b = a - b;//a + b - b = a 
a = a - b;//a + b - a = b
//方法三:异或取值法
a = a ^ b;
b = a ^ b;//a ^ b ^ b = a
a = a ^ b;//a ^ b ^ a = b

二、数据类型

1.分类

基本类型:整型、浮点型、字符型和布尔类型

引用类型:数组、字符串、类和接口

2.基本数据类型对比

  • 类型                                    标识符                                内存大小                                  取值范围
  • 字节型                                   byte                                  1字节                                       -128-127,即2^7到2^7-1
  • 短整型                                  short                                  2字节                                       -256到255
  • 整型                                      int                                      4字节                                        -65536-65535
  • 长整型                                  long                                   8字节                                        一般用于表示10亿以上的数据
  • 单精度浮点型                      float                                   4字节                                        范围比long要大
  • 双精度浮点型                      double                              8字节                                        
  • 字符型                                  char                                  2字节                                         0-65535
  • 布尔型                                  boolean                           不确定                                       true,false

说明:浮点型使用注意

  • 不要再数量级相差很大的浮点类型之间进行运算
  • 避免进行等量判断

3.类型转换

什么是类型转换?一种类型的值赋值给另一种类型的变量时发生类型转换。

有哪些种类的的类型转换?两类,分别是自动类型转换和强制类型转换。

3.1.数值类型之间的转换

  • int n = 263;
  • byte b = (byte)n;//强制类型转换
  • System.out.println(b);//输出是7,原因是超出范围,直接截断
  • short n3 = 5;//只要没超出short范围就是可以自动类型转换
  • n3 = n3 + 5;//这里是高类型赋值给低类型,跟字面量赋值不一样,编译不通过。
  • short n4 = 5;
  • n4 += 5;//正确,也是扩展赋值运算符,会进行强制类型转换。
  • 注:双精度的字面量就是在单精度范围了,也无法自动类型转换。

3.2.自动类型转换

什么时候发生自动类型转换?范围小的类型赋值给范围大的类型时发生自动类型转换,数据不会丢失,类型也不会丢失。

3.3.强制类型转换

什么时候发生强制类型转换?范围大的数据类型赋值给范围小的数字类型。强制类型转换数据可能会丢失,比如把4个字节的int类型赋值给1个字节的byte类型,是直接把最右边的1字节中的数据复制给了byte类型的1字节变量。

语法格式:(数据类型)操作数

3.4.类型提升

操作数1类型 操作数2类 运算后的类型
byte、short、char int int
byte、short、char、int long long
byte、short、char、int、long float float
byte、short、char、int、long、float double double

三、运算符

1.运算符的分类

  • 按操作数的个数分类:一元运算符(++   - -)、二元运算符(+ - *  /  %)以及三元运算符(? :)
  • 按功能分类:算法运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符以及位运算符

2.算法运算符:+  -  *  /  %

2.1.使用除法注意:

  • 若除数与被除数都是整数,结果会取整;
  • 若除数与被除数都是整数,除数不能为0,否则抛出算法异常,编译无法通过。
  • 浮点类型的特殊值:正无穷大、负无穷大、NaN非数字。如下:
    • System.out.println(5.0 / 0);//输出:正无穷大
    • System.out.println(-5.0 / 0);//输出:负无穷大
    • System.out.println(0.0 / 0);//输出:NaN非数字

2.2.使用取余注意:

  • 5 % 2 = 1
  • 5 % -2 = 1
  • -5 % 2 = -1  //符号由被除数决定
  • 5.0 % 2 = 1.0

2.3.自增自减运算符:++    - -

  • 后缀表示:x++,先使用,再自加
  • 前缀表示:++x,先自加,再使用

3.关系运算符

  • >   <   >=   <=   ==    ! =  运算结果是布尔类型boolean

4.逻辑运算符

  • 与(&&)、或(||)和 非(!)
  • 操作数必须是boolean类型!
  • &&, ||  和  &,| 它们的区别是什么?&& || 短路与(或),& | 非短路与(或)。

5.赋值运算符(==)

扩展赋值运算符:+=     -=     *=     /=     %=

使用注意:

  • short n3 = 5;//只要没超出short范围就是可以的
  • //n3 = n3 + 5;//这里是高类型赋值给低类型,跟字面量赋值不一样,编译不通过。
  • short n4 = 5;
  • n4 += 5;//正确,也是扩展赋值运算符,会进行强制类型转换。

6.条件运算符(? :)

  • 格式:表达式1?表达式2:表达式3
  • 说明:若表达式1结果为true,则执行表达式2,否则执行表达式3

7.位运算符

7.1.位运算符分类

  • & 位与
  • | 位或
  • ^ 异或
  • ~ 非
  • << 左移
  • >> 右移
  • >>> 无符号右移

7.2.位运算

计算机中二进制表示形式有以下3种:以十进制5(4个字节)为例,整数是精确存储。

原码:由符号位和数值位组成,符号位:0表示正数,1表示负数

  • 00000000-00000000-0000000-00000101     5的原码
  • 10000000-00000000-0000000-00000101     -5原码

反码:正数的反码与原码一样,负数的反码在原码的基础上除符号位外,其他位取反

  • 00000000-00000000-0000000-00000101     5的反码
  • 11111111-11111111-11111111-11111010           -5的反码

补码:正数的补码与原码一样,负数的补码是在反码的基础上加1

  • 00000000-00000000-0000000-00000101      5的补码
  • 11111111-11111111-11111111-11111011            -5的补码
  • Java中采取补码的形式进行存储和运算的,所以,位运算是针对补码的

&位与,表示1 & 1为1,1 & 0 为0,例如:5 & 2 ,即是从右往左对应位进行&运算,如下

  • 00000000-00000000-0000000-00000101     5的补码
  • 00000000-00000000-0000000-00000010     2补码
  • 00000000-00000000-0000000-00000000     计算结果:0的补码

| 位与,表示0 | 0为0,1 | 0 为0,例如:5 | 2,从右往左对应位进行 | 运算,如下

  • 00000000-00000000-0000000-00000101     5的补码
  • 00000000-00000000-0000000-00000010     2补码
  • 00000000-00000000-0000000-00000111      计算结果:7的补码

^异或,表示相同为0,不同为1,例如:5 ^ 2,从右往左对应位进行 ^ 运算,如下

  • 00000000-00000000-0000000-00000101     5的补码
  • 00000000-00000000-0000000-00000010     2补码
  • 00000000-00000000-0000000-00000111      计算结果:7的补码
  • 注:异或同一个数2次还是其本身

~取反,表示非,例如:~5,从右往左进行 ~ 运算,如下

  • 00000000-00000000-0000000-00000101     5的补码
  • 11111111-11111111-11111111-11111010          计算结果:变化特别大

<<左移,表示向左移动n位,然后用0补位,例如:5 << 2,如果是整数移动的规律:结果为5*2^2 = 20

  • 00000000-00000000-0000000-00000101     5的补码
  • 00000000-00000000-0000000-00010100     计算结果:20的补码

>>右移,表示向右移动n位,高位是0用0补,是1用1补,比如5 >> 2,如果是整数移动的规律:结果为5/(2^2) = 1。

  • 00000000-00000000-0000000-00000101     5的补码
  • 0000000000-00000000-0000000-000001     计算结果:1补码

>>>无符号右移,表示向右移动n位,高位用0补位。比如5 >>> 2

  • 00000000-00000000-0000000-00000101     5的补码
  • 0000000000-00000000-0000000-000001     计算结果:1的补码

8.运算符的优先级

8.1.运算符的优先级

  • ()
  • ++     --     !     ~     +(正)     -(负)
  • *     \     %
  • +     -
  • <<     >>     >>>
  • <     >     <=     >=
  • ==     !=
  • &
  • ^
  • |
  • &&
  • ||
  • ? :
  • =     *=     /=     %=     +=     -=

8.2.常用的整理如下

  • ()
  • ++     --     !
  • 算法:*     /     %
  • + -
  • 关系:>     >=     <     <=
  • ==     !=
  • 逻辑:&&
  • 逻辑:||
  • 条件:?:
  • 赋值: =

四、流程控制

1.控制语句分类

  • 顺序语句:从上到下按顺序依次执行
  • 分支语句:部分代码选择执行或不执行
  • 循环语句:部分代码重复执行

2.流程图

  • 圆角长方形表示开始/结束
  • 平行四边形表示输入输出
  • 正方形表示执行
  • 菱形表示判断

3.条件语句

3.1.单分支条件语句

  • 格式:if( ) { }
  • 只是单独判断条件是否成立

3.2.双分支条件语句

  • 格式:if(){ }else{ }
  • 需要对条件成立和不成立的情况分别处理

3.3.多重if 条件语句

  • 格式:if(){ }else if(){ }else if(){ }else{ }
  • 一旦前面条件成立,则不做后续判断。
  • 注:基本类型直接用双(==)判断,但是引用数据类型不行。即字符可以,字符串不行。

3.4.多分支选择语句

3.4.1.格式

  • switch(表达式){
  • cases 值1: 语句;break;
  • cases 值1: 语句;break;
  • ……
  • default:语句;break;
  • }

3.4.2.说明

  • 表达式:只支持byte、short、int、char、String、枚举类型enum。
  • 表达式是的值的类型与常量值的类型要相符。
  • 同一个switch中标签值不能重复。
  • 所有的break均可省略,若不加break语句,就会对其他条件内容穿透执行且不会再进行判断。
  • default的位置可以更改,不一定非得放在最后,位置变了但是作用不会变。
  • default放在前面,又没有break,一旦执行了default的代码就会发生穿透执行。
  • 支持标签堆叠的语法,比如:
  • switch (month){
  • case 3:
  • case 4:
  • case 5:System.out.println(month+"月属于春季");break;
  • case 6:
  • case 7:
  • case 8:System.out.println(month+"月属于夏季");break;
  • }

3.4.3.switch和多重if的区别:

  • 相同:多个条件判断
  • 不同:多重if用于区间判断,switch用于等值判断。等值判断,switch效率高于多重if,因为常量值会一次性加载到内存中。

3.4.4.分支语句嵌套:所有分支语句可以相互嵌套

4.循环语句

4.1.循环的特点

  • 任何循环都具备的两个特点是循环条件和循环操作。

4.2.循环分类

  • 非固定次数循环:while 和 do-while。解题方式:确定条件和循环操作
  • 固定次数循环:for。解题方式:确定3要素,即循环变量初始值、循环变量终止值(条件)和循环变量变化值(迭代)
  • 注:只要是循环的问题,三者都可以解决。

4.3.for、while和do-while的比较

  • for和while是先判断后执行,而do-while是先执行后判断。
  • for擅长处理固定次数循环,while和do-while擅长处理非固定次数循环。
  • for的循环变量一般定义在局部,循环外无法使用,而while和do-while的循环变量一般定义在循环外,循环结束后能使用。

4.4.多重循环

  • 循环嵌套:3种循环相互可嵌套。
  • 关键点:寻找行、列循环变量之间的关系

5.跳转语句

5.1.break

  • 场合:switch、循环
  • 作用:结束当前循环
  • 注意:switch在循环中使用时,要注意break的影响,仅是用来结束switch的。

5.2.return

  • 场合:方法的任何位置
  • 作用:返回值,或对于无返回值的方法就会结束当前方法执行

5.3.continue

  • 场合:只能用在循环中,结束本次循环
  • 作用:加速循环

5.4.循环标签

  • 场合:用在循环中
  • 作用:对多层次循环起作用
  • 语法:break 标签;或者 continue 标签;如下:
  • a://标签
  • for (int i = 1; i <= 5; i++) {
  •         for (int j = 1; j <= 5; j++) {
  •                   if (i == 3) {
  •                               // break;//结束内循环
  •                              break a;//跳转到标签位置,结束外循环
  •                              // return;//结束方法
  •                   }
  •                   System.out.print(i + "行," + j + "列 ");
  •         }
  •         System.out.println();
  • }
  • a://标签
  • for (int i = 1; i <= 5; i++) {
  •         for (int j = 1; j <= 5; j++) {
  •                  if (j == 3) {
  •                              // continue;//结束本次内循环,进行下一次内循环
  •                              continue a;//结束本次外循环,跳到下次外循环
  •                  }
  •                  System.out.print(i + "行," + j + "列 ");
  •         }
  •         System.out.println();
  • }

五、补充知识

1.注释

单行注释:  //

多行注释:  /*    */

文档注释:   /**    */

位置:

  • 类,类中成员,接口等

生成:

  • javadoc -d doc Hello.java //生成帮助文档,其中-d doc表示存放在doc目录中,没有则生成目录再存放。
  • javadoc -d doc -author -version Hello.java  //将作者和版本信息也生成

优秀的注释:

  • 代码不明确的地方;
  • 代码修改的地方;
  • 经典算法;
  • 分支和循环语句;
  • 对外开发的,如接口。

2.print( ) 和 println( ) 的区别

print( ) 输出后不换行,必须带参数。

println( ) 输出后换行,可以不带参数。

3.转义字符

3.1.转义字符

定义

  • 两个字符组合起来表示一个字符。

作用

  • 有一些字符具有特别的意义,无法直接表示,需要通过转义字符。

表示方式

  • 八进制表示:转义范围为\000-\377,转换成十进制是0-255;
  • 十六进制表示:转义范围为\u0000-\uffff,转换成十进制是0-65535,其中u表示Unicode字符编码,什么是字符编码?见下面;
  • 常用转义字符:\\ 表示反斜杠,\' 表示单引号,\"表示双引号,\t表示水平制表符且左对齐,\n表示换行符;

3.3.进制间的转换

  • 十进制转二进制:除2取余法,到商为0终止,余数从下往上取,结果是从右往左写。
  • 十进制转八进制:除8取余法,到商为0终止,余数从下往上取,结果是从右往左写。
  • 十进制转十六进制:除16取余法,到商为0终止,余数从下往上取,结果是从右往左写。
  • 二进制转十进制:位权求和法,从低位到高位组合运算,比如101,1*2^0+0*2^1+1*2^2
  • 八进制转十进制:位权求和法,从低位到高位组合运算,比如17,7*8^0+1*8^1
  • 十六进制转十进制:位权求和法,从低位到高位组合运算,比如19,9*16^0+1*16^1
  • 二进制转八进制:从右向左3位组合,每个组合转换成十进制,按组合的顺序组成八进制值
  • 二进制转十六进制:从右向左4位组合,每个组合转成十进制,按照组合顺序组成十六进制值

3.4.字符编码

3.4.1.什么是字符编码?

图片、音频都是以二进制方式存储,对于字符,给每个字符进行编码,然后将编码再转成二进制进行存储。例如欧美字符使用ascii码就能表示所有的字符,范围是0-255,用八进制表示,但是,亚洲国家都有自己的字符,所以也需给字符进行编码,所以需要对全世界所有已知的书面语言都进行编码,从而产生了Unicode编码,范围是0-65535,用十六进制表示。简单记忆:字符a十进制为97,八进制为\141,十六进制表示\u0061。

3.4.2.为什么要字符编码?

给字符编码后,计算机直接使用编码可以更容易也更高效的转换成二进制进行存取。

4.控制台输入

import java.util.Scanner;

public class Demo2 {

          public static void main(String[] args) {

                      Scanner superman = new Scanner(System.in);//创建一个对象:创建一个超人

                       //调用方法:超人施展技能

                       //int n = superman.nextInt();//从控制台获取一个整数

                      //System.out.println("n = "+n);

                      //double n1 = superman.nextDouble();

                      //String n2 = superman.next();

                       char n3 = superman.next().charAt(0);

                       System.out.println("n3 = "+n3);

           }

}

5.格式控制

5.1.输出格式:

  • double n = 345.49379852389549;
  • System.out.printf("我想展示小数%.2f", n);
  • System.out.println();
  • int n1 = 11;
  • double n2 = 11.1;
  • char c = 'a';
  • boolean b = true;
  • String s = "hello";
  • System.out.printf("整数%d,小数%f,字符%c,布尔%b,字符串%s", n1,n2,c,b,s);

5.2.使用DecimalFormat类指定小数格式

  • // 0 占位 四舍五入
  • // # 占位 四舍五入
  • DecimalFormat df = new DecimalFormat("0000.00");//整数部分,位数不够用0补齐
  • System.out.println(df.format(n));
  • DecimalFormat df1 = new DecimalFormat("####.##");//整数部分,位数不够不会补齐。
  • System.out.println(df1.format(n));

猜你喜欢

转载自blog.csdn.net/qq_1018944104/article/details/82735235
今日推荐