如何定制网站来维护佛山市住房和建设局的首页?
摘要:定制网站与模板建站维护,佛山市住房和建设局网站首页,自己创建网站要钱吗,网站专题设计稿第02章_变量与运算符 讲师:尚硅谷-宋红康(江湖人称:康师傅&
定制网站与模板建站维护,佛山市住房和建设局网站首页,自己创建网站要钱吗,网站专题设计稿第02章_变量与运算符
讲师#xff1a;尚硅谷-宋红康#xff08;江湖人称#xff1a;康师傅#xff09;
官网#xff1a;http://www.atguigu.com 本章专题与脉络 1. 关键字#xff08;keyword#xff09; 定义#xff1a;被Java语言赋予了特殊含义#xff0c;用做专门…第02章_变量与运算符
讲师尚硅谷-宋红康江湖人称康师傅
官网http://www.atguigu.com 本章专题与脉络 1. 关键字keyword 定义被Java语言赋予了特殊含义用做专门用途的字符串或单词 HelloWorld案例中出现的关键字有 class、public 、 static 、 void 等这些单词已经被Java定义好了。 特点全部关键字都是小写字母。 关键字比较多不需要死记硬背学到哪里记到哪里即可。 官方地址 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html 说明 关键字一共50个其中const和goto是保留字(reserved word)。 truefalsenull不在其中它们看起来像关键字其实是字面量表示特殊的布尔值和空值。 2. 标识符( identifier)
Java中变量、方法、类等要素命名时使用的字符序列称为标识符。
技巧凡是自己可以起名字的地方都叫标识符。
标识符的命名规则必须遵守的硬性规定 由26个英文字母大小写0-9 _或 $ 组成 数字不可以开头。不可以使用关键字和保留字但能包含关键字和保留字。Java中严格区分大小写长度无限制。标识符不能包含空格。 练习miles、Test、a、 --a、4#R、$4、 #44、apps、class、public、int、x、y、radius 标识符的命名规范建议遵守的软性要求否则工作时容易被鄙视: 包名多单词组成时所有字母都小写xxxyyyzzz。例如java.lang、com.atguigu.bean 类名、接口名多单词组成时所有单词的首字母大写XxxYyyZzz例如HelloWorldStringSystem等 变量名、方法名多单词组成时第一个单词首字母小写第二个单词开始每个单词首字母大写xxxYyyZzz例如age,name,bookName,main,binarySearch,getName 常量名所有字母都大写。多单词时每个单词用下划线连接XXX_YYY_ZZZ例如MAX_VALUE,PI,DEFAULT_CAPACITY
注意在起名字时为了提高阅读性要尽量有意义“见名知意”。 更多细节详见《代码整洁之道_关于标识符.txt》《阿里巴巴Java开发手册-1.7.1-黄山版》 3. 变量
3.1 为什么需要变量 一花一世界如果把一个程序看做一个世界或一个社会的话那么变量就是程序世界的花花草草、万事万物。即变量是程序中不可或缺的组成单位最基本的存储单元。 3.2 初识变量 变量的概念 内存中的一个存储区域该区域的数据可以在同一类型范围内不断变化 变量的构成包含三个要素数据类型、变量名、存储的值 Java中变量声明的格式数据类型 变量名 变量值 变量的作用用于在内存中保存数据。 使用变量注意 Java中每个变量必须先声明后使用。 使用变量名来访问这块区域的数据。 变量的作用域其定义所在的一对{ }内。 变量只有在其作用域内才有效。出了作用域变量不可以再被调用。 同一个作用域内不能定义重名的变量。
3.3 Java中变量的数据类型
Java中变量的数据类型分为两大类 基本数据类型包括 整数类型、浮点数类型、字符类型、布尔类型。 引用数据类型包括数组、 类、接口、枚举、注解、记录。 3.4 变量的使用
3.4.1 步骤1变量的声明
格式数据类型 变量名;
//例如
//存储一个整数类型的年龄
int age;
//存储一个小数类型的体重
double weight;
//存储一个单字符类型的性别
char gender;
//存储一个布尔类型的婚姻状态
boolean marry;
//存储一个字符串类型的姓名
String name;
//声明多个同类型的变量
int a,b,c; //表示a,b,c三个变量都是int类型。 注意变量的数据类型可以是基本数据类型也可以是引用数据类型。 3.4.2 步骤2变量的赋值
给变量赋值就是把“值”存到该变量代表的内存空间中。同时给变量赋的值类型必须与变量声明的类型一致或兼容。
变量赋值的语法格式
变量名 值;
举例1可以使用合适类型的常量值给已经声明的变量赋值
age 18;
weight 109;
gender 女;
举例2可以使用其他变量或者表达式给变量赋值
int m 1;
int n m;int x 1;
int y 2;
int z 2 * x y;
3变量可以反复赋值
//先声明后初始化
char gender;
gender 女;
//给变量重新赋值修改gender变量的值
gender 男;
System.out.println(gender gender);//gender 男
举例4也可以将变量的声明和赋值一并执行
boolean isBeauty true;
String name 迪丽热巴;
内存结构如图 4. 基本数据类型介绍
4.1 整数类型byte、short、int、long Java各整数类型有固定的表数范围和字段长度不受具体操作系统的影响以保证Java程序的可移植性。 定义long类型的变量赋值时需要以l或L作为后缀。 Java程序中变量通常声明为int型除非不足以表示较大的数才使用long。 Java的整型常量默认为 int 型。
4.1.1 补充计算机存储单位 字节Byte是计算机用于计量存储容量的基本单位一个字节等于8 bit。 位bit是数据存储的最小单位。二进制数系统中每个0或1就是一个位叫做bit比特其中8 bit 就称为一个字节(Byte)。 转换关系 8 bit 1 Byte 1024 Byte 1 KB 1024 KB 1 MB 1024 MB 1 GB 1024 GB 1 TB
4.2 浮点类型float、double 与整数类型类似Java 浮点类型也有固定的表数范围和字段长度不受具体操作系统的影响。 浮点型常量有两种表示形式 十进制数形式。如5.12 512.0f .512 (必须有小数点 科学计数法形式。如5.12e2 512E2 100E-2 float单精度尾数可以精确到7位有效数字。很多情况下精度很难满足需求。 double双精度精度是float的两倍。通常采用此类型。 定义float类型的变量赋值时需要以f或F作为后缀。 Java 的浮点型常量默认为double型。
4.2.1 关于浮点型精度的说明 并不是所有的小数都能可以精确的用二进制浮点数表示。二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。 浮点类型float、double的数据不适合在不容许舍入误差的金融计算领域。如果需要精确数字计算或保留指定位数的精度需要使用BigDecimal类。 测试用例
//测试1解释见章末企业真题为什么0.1 0.2不等于0.3
System.out.println(0.1 0.2);//0.30000000000000004//测试2
float ff1 123123123f;
float ff2 ff1 1;
System.out.println(ff1);
System.out.println(ff2);
System.out.println(ff1 ff2);4.2.2 应用举例
案例1定义圆周率并赋值为3.14现有3个圆的半径分别为1.2、2.5、6求它们的面积。
/*** author 尚硅谷-宋红康* create 12:36*/
public class Exercise1 {public static void main(String[] args) {double PI 3.14; //圆周率double radius1 1.2;double radius2 2.5;int radius3 6;System.out.println(第1个圆的面积 PI * radius1 * radius1);System.out.println(第2个圆的面积 PI * radius2 * radius2);System.out.println(第3个圆的面积 PI * radius3 * radius3);}
}
案例2小明要到美国旅游可是那里的温度是以华氏度为单位记录的。 它需要一个程序将华氏温度80度转换为摄氏度并以华氏度和摄氏度为单位分别显示该温度。
℃ (℉ - 32) / 1.8
/*** author 尚硅谷-宋红康* create 12:51*/
public class Exercise2 {public static void main(String[] args) {double hua 80;double she (hua-32)/1.8;System.out.println(华氏度 hua℉转为摄氏度是 she℃);}
}
4.3 字符类型char char 型数据用来表示通常意义上“字符”占2字节 Java中的所有字符都使用Unicode编码故一个字符可以存储一个字母一个汉字或其他书面语的一个字符。 字符型变量的三种表现形式 形式1使用单引号( )括起来的单个字符。 例如char c1 a; char c2 中; char c3 9; 形式2直接使用 Unicode值来表示字符型常量‘\uXXXX’。其中XXXX代表一个十六进制整数。 例如\u0023 表示 #。 形式3Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。 例如char c3 \n; // \n表示换行符 转义字符说明Unicode表示方式\n换行符\u000a\t制表符\u0009\双引号\u0022\单引号\u0027\\反斜线\u005c\b退格符\u0008\r回车符\u000d char类型是可以进行运算的。因为它都对应有Unicode码可以看做是一个数值。
4.4 布尔类型boolean boolean 类型用来判断逻辑条件一般用于流程控制语句中 if条件控制语句 while循环控制语句 for循环控制语句 do-while循环控制语句 boolean类型数据只有两个值true、false无其它。 不可以使用0或非 0 的整数替代false和true这点和C语言不同。 拓展Java虚拟机中没有任何供boolean值专用的字节码指令Java语言表达所操作的boolean值在编译之后都使用java虚拟机中的int数据类型来代替true用1表示false用0表示。——《java虚拟机规范 8版》 举例
boolean isFlag true;if(isFlag){//true分支
}else{ //false分支
} 经验之谈 Less is More建议不要这样写if ( isFlag true )只有新手才如此。关键也很容易写错成if(isFlag true)这样就变成赋值isFlag为true而不是判断老鸟的写法是if (isFlag)或者if ( !isFlag)。 5. 基本数据类型变量间运算规则
在Java程序中不同的基本数据类型只有7种不包含boolean类型变量的值经常需要进行相互转换。
转换的方式有两种自动类型提升和强制类型转换。
5.1 自动类型提升
规则将取值范围小或容量小的类型自动提升为取值范围大或容量大的类型 。 基本数据类型的转换规则如图所示 1当把存储范围小的值常量值、变量的值、表达式计算的结果值赋值给了存储范围大的变量时
int i A;//char自动升级为int其实就是把字符的编码值赋值给i变量了
double d 10;//int自动升级为double
long num 1234567; //右边的整数常量值如果在int范围呢编译和运行都可以通过这里涉及到数据类型转换//byte bigB 130;//错误右边的整数常量值超过byte范围
long bigNum 12345678912L;//右边的整数常量值如果超过int范围必须加L显式表示long类型。否则编译不通过
2当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时会按照其中最大的类型运算。
int i 1;
byte b 1;
double d 1.0;double sum i b d;//混合运算升级为double
3当byte,short,char数据类型的变量进行算术运算时按照int类型处理。
byte b1 1;
byte b2 2;
byte b3 b1 b2;//编译报错b1 b2自动升级为intchar c1 0;
char c2 A;
int i c1 c2;//至少需要使用int类型来接收
System.out.println(c1 c2);//113
练习
设 x 为float型变量y为double型变量a为int型变量b为long型变量c为char型变量则表达式
x y * a / x b / y c的值类型为A. int B. long C. double D. char
5.2 强制类型转换
将3.14 赋值到int 类型变量会发生什么产生编译失败肯定无法赋值。
int i 3.14; // 编译报错
想要赋值成功只有通过强制类型转换将double 类型强制转换成int 类型才能赋值。 规则将取值范围大或容量大的类型强制转换成取值范围小或容量小的类型。 自动类型提升是Java自动执行的而强制类型转换是自动类型提升的逆运算需要我们自己手动执行。 转换格式
数据类型1 变量名 (数据类型1)被强转数据值; //()中的数据类型必须变量值的数据类型
1当把存储范围大的值常量值、变量的值、表达式计算的结果值强制转换为存储范围小的变量时可能会损失精度或溢出。
int i (int)3.14;//损失精度double d 1.2;
int num (int)d;//损失精度int i 200;
byte b (byte)i;//溢出
2当某个值想要提升数据类型时也可以使用强制类型转换。这种情况的强制类型转换是没有风险的通常省略。
int i 1;
int j 2;
double bigger (double)(i/j);
3声明long类型变量时可以出现省略后缀的情况。float则不同。
long l1 123L;
long l2 123;//如何理解呢 此时可以看做是int类型的123自动类型提升为long类型//long l3 123123123123; //报错因为123123123123超出了int的范围。
long l4 123123123123L;//float f1 12.3; //报错因为12.3看做是double不能自动转换为float类型
float f2 12.3F;
float f3 (float)12.3;
练习判断是否能通过编译
1short s 5;s s-2; //判断no
2 byte b 3;b b 4; //判断nob (byte)(b4); //判断yes
3char c ‘a’;int i 5;float d .314F;double result cid; //判断yes
4 byte b 5;short s 3;short t s b; //判断no问答为什么标识符的声明规则里要求不能数字开头
//如果允许数字开头则如下的声明编译就可以通过
int 123L 12;
//进而如下的声明中l的值到底是123还是变量123L对应的取值12呢 出现歧义了。
long l 123L;
5.3 基本数据类型与String的运算
5.3.1 字符串类型String String不是基本数据类型属于引用数据类型 使用一对来表示一个字符串内部可以包含0个、1个或多个字符。 声明方式与基本数据类型类似。例如String str “尚硅谷”;
5.3.2 运算规则
1、任意八种基本数据类型的数据与String类型只能进行连接“”运算且结果一定也是String类型
System.out.println( 1 2);//12int num 10;
boolean b1 true;
String s1 abc;String s2 s1 num b1;
System.out.println(s2);//abc10true//String s3 num b1 s1;//编译不通过因为int类型不能与boolean运算
String s4 num (b1 s1);//编译通过
2、String类型不能通过强制类型()转换转为其他的类型
String str 123;
int num (int)str;//错误的int num Integer.parseInt(str);//正确的后面才能讲到借助包装类的方法才能转
5.3.3 案例与练习
案例公安局身份登记
要求填写自己的姓名、年龄、性别、体重、婚姻状况已婚用true表示单身用false表示、联系方式等等。
/*** author 尚硅谷-宋红康* create 12:34*/
public class Info {public static void main(String[] args) {String name 康师傅;int age 37;char gender 男;double weight 145.6;boolean isMarried true;String phoneNumber 13112341234;System.out.println(姓名 name);System.out.println(年龄 age);System.out.println(性别 gender);System.out.println(体重 weight);System.out.println(婚否 isMarried);System.out.println(电话 phoneNumber);//或者System.out.println(name name ,age age gender gender ,weight weight ,isMarried isMarried ,phoneNumber phoneNumber);}
}
练习
练习1
String str1 4; //判断对错
String str2 3.5f ; //判断str2对错
System.out.println(str2); //输出
System.out .println(34Hello!); //输出
System.out.println(Hello!34); //输出
System.out.println(a1Hello!); //输出
System.out.println(Helloa1); //输出
练习2
System.out.println(* *); //输出
System.out.println(*\t*); //输出
System.out.println(* \t *); //输出
System.out.println(* \t *); //输出
System.out.println(* \t *); //输出
System.out.println(* \t *); //输出
System.out.println(* \t *); //输出
System.out.println(* \t *); //输出
6. 计算机底层如何存储数据
计算机世界中只有二进制所以计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。 世界上有10种人 认识和不认识二进制的。
6.1 进制的分类 十进制decimal 数字组成0-9 进位规则满十进一 二进制binary 数字组成0-1 进位规则满二进一以0b或0B开头 八进制octal很少使用 数字组成0-7 进位规则满八进一以数字0开头表示 十六进制 数字组成0-9a-f 进位规则满十六进一以0x或0X开头表示。此处的 a-f 不区分大小写
代码演示
class BinaryTest {public static void main(String[] args) {int num1 123; //十进制int num2 0b101; //二进制int num3 0127; //八进制int num4 0x12aF; //十六进制System.out.println(num1);System.out.println(num2);System.out.println(num3);System.out.println(num4);}
}
6.2 进制的换算举例
十进制二进制八进制十六进制000011112102231133410044510155611066711177810001089100111910101012a或A11101113b或B12110014c或C13110115d或D14111016e或E15111117f或F16100002010
6.3 二进制的由来
二进制是计算技术中广泛采用的一种数制由德国数理哲学大师莱布尼茨于1679年发明。
二进制数据是用0和1两个数码来表示的数。它的基数为2进位规则是“逢二进一”。
二进制广泛应用于我们生活的方方面面。比如广泛使用的摩尔斯电码Morse Code它由两种基本信号组成短促的点信号“·”读“滴”保持一定时间的长信号“—”读“嗒”。然后组成了26个字母从而拼写出相应的单词。 记忆技巧 我们偶尔会看到的SOS即为 6.4 二进制转十进制
二进制如何表示整数 计算机数据的存储使用二进制补码形式存储并且最高位是符号位。 正数最高位是0 负数最高位是1 规 定 正数的补码与反码、原码一样称为三码合一 负数的补码与反码、原码不一样 负数的原码把十进制转为二进制然后最高位设置为1 负数的反码在原码的基础上最高位不变其余位取反0变1,1变0 负数的补码反码1
二进制转十进制权相加法
针对于byte数据举例来说 例如byte类型1个字节8位 25 原码 0001 1001 反码 0001 1001 --补码 0001 1001 -25 原码 1001 1001 反码1110 0110 补码 1110 0111
整数
正数25 00000000 00000000 000000000 00011001原码
正数25 00000000 00000000 000000000 00011001反码
正数25 00000000 00000000 000000000 00011001补码负数-25 10000000 00000000 000000000 00011001原码
负数-25 11111111 11111111 111111111 11100110反码
负数-25 11111111 11111111 111111111 11100111补码
一个字节可以存储的整数范围是多少
//1个字节8位0000 0001 ~ 0111 111 1~1271000 0001 ~ 1111 1111 -127 ~ -10000 0000 01000 0000 -128特殊规定-127-1
6.5 十进制转二进制
十进制转二进制除2取余的逆 6.6 二进制与八进制、十六进制间的转换
二进制转八进制 二进制转十六进制 八进制、十六进制转二进制 6.7 各进制间的转换 练习
1.将以下十进制数转换为十六进制和二进制
123 256 87 622.将以下十六进制数转换为十进制和二进制
0x123 0x25F 0x38 0x62
7. 运算符Operator掌握
运算符是一种特殊的符号用以表示数据的运算、赋值和比较等。
运算符的分类 按照功能分为算术运算符、赋值运算符、比较(或关系)运算符、逻辑运算符、位运算符、条件运算符、Lambda运算符
分类运算符算术运算符7个、-、*、/、%、、--赋值运算符12个、、-、*、/、%、、、、、|、^等比较(或关系)运算符6个、、、、、!逻辑运算符6个、|、^、!、、||位运算符7个、|、^、~、、、条件运算符1个(条件表达式)?结果1:结果2Lambda运算符1个-第18章时讲解按照操作数个数分为一元运算符单目运算符、二元运算符双目运算符、三元运算符 三目运算符
分类运算符一元运算符单目运算符正号、负号-、、--、!、~二元运算符双目运算符除了一元和三元运算符剩下的都是二元运算符三元运算符 三目运算符(条件表达式)?结果1:结果2
7.1 算术运算符
7.1.1 基本语法 举例1加减乘除模
public class ArithmeticTest1 {public static void main(String[] args) {int a 3;int b 4;System.out.println(a b);// 7System.out.println(a - b);// -1System.out.println(a * b);// 12System.out.println(a / b);// 计算机结果是0为什么不是0.75呢System.out.println(a % b);// 3//结果与被模数符号相同System.out.println(5%2);//1System.out.println(5%-2);//1System.out.println(-5%2);//-1System.out.println(-5%-2);//-1 //商*除数 余数 被除数//5%-2 商是-2余数时1 (-2)*(-2)1 5//-5%2 商是-2余数是-1 (-2)*2(-1) -4-1-5}
}
举例2“”号的两种用法 第一种对于两边都是数值的话就是加法的意思 第二种对于两边至少有一边是字符串的话就是拼接的意思
public class ArithmeticTest2 {public static void main(String[] args) {// 字符串类型的变量基本使用// 数据类型 变量名称 数据值;String str1 Hello;System.out.println(str1); // HelloSystem.out.println(Hello World); // HelloWorldString str2 Java;// String int -- StringSystem.out.println(str2 520); // Java520// String int int// String int// StringSystem.out.println(str2 5 20); // Java520}
}
举例3自加自减运算
理解 运算表示自增1。同理-- 运算表示自减1用法与 一致。
1、单独使用 变量在单独运算的时候变量前和变量后是没有区别的。 变量前 例如 a 。 变量后 例如 a 。
public class ArithmeticTest3 {public static void main(String[] args) {// 定义一个int类型的变量aint a 3;//a;a;// 无论是变量前还是变量后结果都是4System.out.println(a);}
}
2、复合使用 和其他变量放在一起使用或者和输出语句放在一起使用前和后就产生了不同。 变量前 变量先自增1然后再运算。 变量后 变量先运算然后再自增1。
public class ArithmeticTest4 {public static void main(String[] args) {// 其他变量放在一起使用int x 3;//int y x; // y的值是4x的值是4int y x; // y的值是3x的值是4System.out.println(x);System.out.println(y);System.out.println();// 和输出语句一起int z 5;//System.out.println(z);// 输出结果是6z的值也是6System.out.println(z);// 输出结果是5z的值是6System.out.println(z);}
}
7.1.2 案例与练习
案例1
随意给出一个整数打印显示它的个位数十位数百位数的值。
格式如下
数字xxx的情况如下
个位数
十位数
百位数例如
数字153的情况如下
个位数3
十位数5
百位数1/*** author 尚硅谷-宋红康* create 12:20*/
class ArithmeticExer1 {public static void main(String[] args) {int num 187;int bai num / 100;int shi num % 100 / 10;//int shi num / 10 % 10;int ge num % 10;System.out.println(百位为 bai);System.out.println(十位为 shi);System.out.println(个位为 ge);}
}
拓展获取一个四位数的个位十位百位千位
/*** author 尚硅谷-宋红康* create 12:39*/
public class ArithmeticExer01 {public static void main (String [] args) {//1.定义一个变量赋值为一个四位数整数例如1234int num 1234;//2.通过运算操作求出个位十位百位千位int ge num % 10;int shi num /10 % 10;int bai num /100 % 10;int qian num / 1000 % 10;System.out.println(个位上的数字是 ge);System.out.println(十位上的数字是 shi);System.out.println(百位上的数字是 bai);System.out.println(千位上的数字是 qian);}
}
案例2为抵抗洪水战士连续作战89小时编程计算共多少天零多少小时
/*** author 尚硅谷-宋红康* create 17:47*/
public class ArithmeticExer2 {public static void main(String[] args){int hours 89;int day hours / 24;int hour hours % 24;System.out.println(为抵抗洪水战士连续作战89小时);System.out.println(hours 是 day 天 hour 小时);}
}
练习1算术运算符自加、自减
public class ArithmeticExer3{public static void main(String[] args){int i1 10;int i2 20;int i i1;System.out.print(ii); //System.out.println(i1i1);//i i1;System.out.print(ii);//System.out.println(i1i1);//i i2--;System.out.print(ii);//System.out.println(i2i2);//i --i2;System.out.print(ii);//System.out.println(i2i2);//}
}
练习2
System.out.println(55 5 5); //打印结果是 5555 ?
练习3
byte bb1 127;
bb1;
System.out.println(bb1 bb1);//-128
练习4
int i 1;
int j i i * i;
System.out.println(j j);
练习5企业真题写出下列程序的输出结果
int i 2;
int j i;
System.out.println(j);int m 2;
m m; //(1)先取b的值“2”放操作数栈 (2)m再自增,m3 (3)再把操作数栈中的2赋值给m,m2
System.out.println(m);
7.2 赋值运算符
7.2.1 基本语法 符号 当“”两侧数据类型不一致时可以使用自动类型转换或使用强制类型转换原则进行处理。 支持连续赋值。 扩展赋值运算符 、 -、*、 /、% 赋值运算符符号解释将符号左边的值和右边的值进行相加操作最后将结果赋值给左边的变量-将符号左边的值和右边的值进行相减操作最后将结果赋值给左边的变量*将符号左边的值和右边的值进行相乘操作最后将结果赋值给左边的变量/将符号左边的值和右边的值进行相除操作最后将结果赋值给左边的变量%将符号左边的值和右边的值进行取余操作最后将结果赋值给左边的变量
public class SetValueTest1 {public static void main(String[] args) {int i1 10;long l1 i1; //自动类型转换byte bb1 (byte)i1; //强制类型转换int i2 i1;//连续赋值的测试//以前的写法int a1 10;int b1 10;//连续赋值的写法int a2,b2;a2 b2 10;int a3 10,b3 20;//举例说明 - * / % int m1 10;m1 5; //类似于 m1 m1 5的操作但不等同于。System.out.println(m1);//15//练习1开发中如何实现一个变量2的操作呢// 的操作不会改变变量本身的数据类型。其他拓展的运算符也如此。//写法1推荐short s1 10;s1 2; //编译通过因为在得到int类型的结果后JVM自动完成一步强制类型转换将int类型强转成shortSystem.out.println(s1);//12//写法2short s2 10;//s2 s2 2;//编译报错因为将int类型的结果赋值给short类型的变量s时可能损失精度s2 (short)(s2 2);System.out.println(s2);//练习2开发中如何实现一个变量1的操作呢//写法1推荐int num1 10;num1;System.out.println(num1);//写法2int num2 10;num2 1;System.out.println(num2);//写法3int num3 10;num3 num3 1;System.out.println(num3);}
}
7.2.2 练习
练习1
short s 3;
s s2; //① 编译报错
s 2; //② 正常执行//①和②有什么区别 练习2
int i 1;
i * 0.1;
System.out.println(i);//0
i;
System.out.println(i);//1练习3
int m 2;
int n 3;
n * m; //n n * m;
System.out.println(m m);//3
System.out.println(n n);//6练习4
int n 10;
n (n) (n); //n n (n) (n)
System.out.println(n);//32练习5你有几种办法实现变量值减1变量值减2呢
/*** author 尚硅谷-宋红康* create 16:55*/
public class MinusTest {public static void main(String[] args) {//练习①变量值减1short s 10;//方式1//s (short)(s - 1);//方式2推荐s--; //或者 --s//方式3s - 1;//练习②变量值减2short s1 10;//方式1//s1 (short)(s1 - 2);//方式2推荐s1 - 2;}
}
7.3 比较(关系)运算符 比较运算符的结果都是boolean型也就是要么是true要么是false。 只适用于基本数据类型除boolean类型之外 ! 适用于基本数据类型和引用数据类型 比较运算符“”不能误写成“”
举例
class CompareTest {public static void main(String[] args) {int i1 10;int i2 20;System.out.println(i1 i2);//falseSystem.out.println(i1 ! i2);//trueSystem.out.println(i1 i2);//falseint m 10;int n 20;System.out.println(m n);//falseSystem.out.println(m n);//20boolean b1 false;boolean b2 true;System.out.println(b1 b2);//falseSystem.out.println(b1 b2);//true}
}
思考
boolean b1 false;
//区分好和的区别。
if(b1 true) //if(b1 true)System.out.println(结果为真);
elseSystem.out.println(结果为假);7.4 逻辑运算符
7.4.1 基本语法 逻辑运算符操作的都是boolean类型的变量或常量而且运算得结果也是boolean类型的值。 运算符说明 和 表示且关系当符号左右两边布尔值都是true时结果才能为true。否则为false。 | 和 || 表示或关系当符号两边布尔值有一边为true时结果为true。当两边都为false时结果为false ! 表示非关系当变量布尔值为true时结果为false。当变量布尔值为false时结果为true。 ^ 当符号左右两边布尔值不同时结果为true。当两边布尔值相同时结果为false。 理解异或追求的是“异” 逻辑运算符用于连接布尔型表达式在Java中不可以写成 3 x 6应该写成x 3 x 6 。 区分“”和“” 相同点如果符号左边是true则二者都执行符号右边的操作 不同点 如果符号左边是false,则继续执行符号右边的操作 如果符号左边是false,则不再继续执行符号右边的操作 建议开发中推荐使用 区分“|”和“||” 相同点如果符号左边是false则二者都执行符号右边的操作 不同点| 如果符号左边是true则继续执行符号右边的操作 || 如果符号左边是true则不再继续执行符号右边的操作 建议开发中推荐使用 ||
代码举例
public class LoginTest {public static void main(String[] args) {int a 3;int b 4;int c 5;// 与且有false则falseSystem.out.println((a b) (a c)); System.out.println((a b) (a c)); System.out.println((a b) (a c)); System.out.println((a b) (a c)); System.out.println();// | 或有true则trueSystem.out.println((a b) | (a c)); System.out.println((a b) | (a c)); System.out.println((a b) | (a c));System.out.println((a b) | (a c));System.out.println();// ^ 异或相同为false不同为trueSystem.out.println((a b) ^ (a c));System.out.println((a b) ^ (a c)); System.out.println((a b) ^ (a c)); System.out.println((a b) ^ (a c)); System.out.println();// ! 非非false则true非true则falseSystem.out.println(!false);System.out.println(!true);//和的区别System.out.println((a b) (a c)); System.out.println(a a);System.out.println((a b) (a c)); System.out.println(a a);System.out.println((a b) (a c)); System.out.println(a a);//|和||的区别System.out.println((a b) | (a c)); System.out.println(a a);System.out.println((a b) || (a c)); System.out.println(a a);System.out.println((a b) || (a c)); System.out.println(a a);}
}
7.4.2 案例与练习
案例
1. 定义类 CompareLogicExer
2. 定义 main方法
3. 定义一个int类型变量a,变量b,都赋值为20
4. 定义boolean类型变量bo1 , 判断a 是否被3整除,并且a 是否被7整除,将结果赋值给bo1
5. 输出a的值,bo1的值
6. 定义boolean类型变量bo2 , 判断b 是否被3整除,并且b 是否被7整除,将结果赋值给bo2
7. 输出b的值,bo2的值
/*** author 尚硅谷-宋红康* create 12:42*/
public class CompareLogicExer {public static void main(String[] args){int a 20;int b 20;boolean bo1 ((a % 3) 0) ((a % 7) 0);System.out.println(bo1的值 bo1);System.out.println(a的值 a);System.out.println(----------------------------);boolean bo2 ((b % 3) 0) ((b % 7) 0); System.out.println(bo2的值 bo2);System.out.println(b的值 b);}
}
练习1区分 和
int x 1;
int y 1;if(x 2 y 2){x 7;
}
System.out.println(x x ,y y);int x 1,y 1;if(x 2 y 2){x 7;
}
System.out.println(xx,yy);练习2区分 | 和 ||
int x 1,y 1;if(x1 | y1){x 7;
}
System.out.println(xx,yy);int x 1,y 1;if(x1 || y1){x 7;
}
System.out.println(xx,yy);练习3程序输出
class Test {public static void main (String [] args) {boolean x true;boolean y false;short z 42;if ((z 42) (y true)) {z;}if ((x false) || (z 45)) {z;}System.out.println(z z);}
}
//结果为
//z 46
7.5 位运算符难点、非重点
7.5.1 基本语法 位运算符的运算过程都是基于二进制的补码运算
1左移
运算规则在一定范围内数据每向左移动一位相当于原数据*2。正数、负数都适用
【注意】当左移的位数n超过该数据类型的总位数时相当于左移n-总位数位
34 类似于 3*2的4次幂 3*16 48 -34 类似于 -3*2的4次幂 -3*16 -48 2右移
运算规则在一定范围内数据每向右移动一位相当于原数据/2。正数、负数都适用
【注意】如果不能整除向下取整。
694 类似于 69/2的4次 69/16 4 -694 类似于 -69/2的4次 -69/16 -5 3无符号右移
运算规则往右移动后左边空出来的位直接补0。正数、负数都适用
694 类似于 69/2的4次 69/16 4 -694 结果268435451 4按位与
运算规则对应位都是1才为1否则为0。 1 1 结果为1 1 0 结果为0 0 1 结果为0 0 0 结果为0
9 7 1 -9 7 7 5按位或|
运算规则对应位只要有1即为1否则为0。 1 | 1 结果为1 1 | 0 结果为1 0 | 1 结果为1 0 0 结果为0
9 | 7 //结果 15 -9 | 7 //结果 -9 6按位异或^
运算规则对应位一个为1一个为0才为1否则为0。 1 ^ 1 结果为0 1 ^ 0 结果为1 0 ^ 1 结果为1 0 ^ 0 结果为0
9 ^ 7 //结果为14 -9 ^ 7 //结果为-16 7按位取反~
运算规则对应位为1则结果为0对应位为0则结果为1。 ~0就是1 ~1就是0
~9 //结果-10 ~-9 //结果8 7.5.2 举例
举例1 举例2体会 m k ^ n (m ^ n) ^ n 7.5.3 案例
案例1高效的方式计算2 * 8的值经典面试题
答案2 3 、 8 1
案例2如何交换两个int型变量的值String呢
/*** author 尚硅谷-宋红康* create 16:58*/
public class BitExer {public static void main(String[] args) {int m 10;int n 5;System.out.println(m m , n n);//推荐实现方式1优点容易理解适用于不同数据类型 缺点需要额外定义变量//int temp m;//m n;//n temp;//实现方式2优点没有额外定义变量 缺点可能超出int的范围只能适用于数值类型//m m n; //15 10 5//n m - n;//10 15 - 5//m m - n;//5 15 - 10//实现方式3优点没有额外定义变量 缺点不易理解只能适用于数值类型m m ^ n; n m ^ n; //(m ^ n) ^ nm m ^ n;System.out.println(m m , n n);}
}
7.6 条件运算符
7.6.1 基本语法 条件运算符格式
(条件表达式)? 表达式1:表达式2 说明条件表达式是boolean类型的结果根据boolean的值选择表达式1或表达式2 如果运算后的结果赋给新的变量要求表达式1和表达式2为同种或兼容的类型
public static void main(String[] args) {int i (12 ? 100 : 200);System.out.println(i);//200boolean marry false;System.out.println(marry ? 已婚 : 未婚 );double d1 (m1 m2)? 1 : 2.0;System.out.println(d1);int num 12;System.out.println(num 0? true : num非正数);
}
7.6.2 案例
案例1获取两个数中的较大值
/*** author 尚硅谷-宋红康* create 12:40*/
public class ConditionExer1 {public static void main(String[] args) {//获取两个数的较大值int m1 10;int m2 20;int max1 (m1 m2)? m1 : m2;System.out.println(m1和m2中的较大值为 max1);}
}
案例2获取三个数中的最大值
/*** author 尚硅谷-宋红康* create 12:43*/
public class ConditionExer2 {public static void main(String[] args) {int n1 23;int n2 13;int n3 33;//写法1int tempMax (n1 n2)? n1:n2;int finalMax (tempMax n3)? tempMax : n3;System.out.println(三个数中最大值为 finalMax);//写法2不推荐可读性差int finalMax1 (((n1 n2)? n1:n2) n3)? ((n1 n2)? n1:n2) : n3;System.out.println(三个数中最大值为 finalMax1);}
}
案例3今天是周210天以后是周几
要求控制台输出今天是周210天以后是周x。
/*** author 尚硅谷-宋红康* create 12:46*/
public class ConditionExer3 {public static void main(String[] args) {int week 2;week 10;week % 7;System.out.println(今天是周2,10天以后是周 (week 0 ? 日 : week));}}
7.6.3 与if-else的转换关系 凡是可以使用条件运算符的地方都可以改写为if-else结构。反之不成立。 开发中如果既可以使用条件运算符又可以使用if-else推荐使用条件运算符。因为执行效率稍高。
//if-else实现获取两个数的较大值int i1 10;
int i2 20;int max;//声明变量max用于记录i1和i2的较大值if(i1 i2){max i1;
}else{max i2;
}System.out.println(max); 7.7 运算符优先级
运算符有不同的优先级所谓优先级就是在表达式运算中的运算符顺序。
上一行中的运算符总是优先于下一行的。
优先级运算符说明Java运算符1括号()、[]、{}2正负号、-3单元运算符、--、~、4乘法、除法、求余*、/、%5加法、减法、-6移位运算符、、7关系运算符、、、、instanceof8等价运算符、!9按位与10按位异或^11按位或|12条件与13条件或||14三元运算符? :15赋值运算符、、-、*、/、%16位赋值运算符、|、、、开发建议 不要过多的依赖运算的优先级来控制表达式的执行顺序这样可读性太差尽量使用()来控制表达式的执行顺序。 不要把一个表达式写得过于复杂如果一个表达式过于复杂则把它分成几步来完成。例如 (num1 num2) * 2 num3 num2 num3 ? num3 : num1 num2; 8. 【拓展】关于字符集
8.1 字符集 编码与解码
计算机中储存的信息都是用二进制数表示的而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则将字符存储到计算机中称为编码 。反之将存储在计算机中的二进制数按照某种规则解析显示出来称为解码 。 字符编码Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。 字符集也叫编码表。是一个系统支持的所有字符的集合包括各国家文字、标点符号、图形符号、数字等。
8.2 ASCII码 ASCII码American Standard Code for Information Interchange美国信息交换标准代码上个世纪60年代美国制定了一套字符编码对英语字符与二进制位之间的关系做了统一规定。这被称为ASCII码。 ASCII码用于显示现代英语主要包括控制字符回车键、退格、换行键等和可显示字符英文大小写字符、阿拉伯数字和西文符号。 基本的ASCII字符集使用7位bits表示一个字符最前面的1位统一规定为0共128个字符。比如空格“SPACE”是32二进制00100000大写的字母A是65二进制01000001。 缺点不能表示所有字符。 8.3 ISO-8859-1字符集 拉丁码表别名Latin-1用于显示欧洲使用的语言包括荷兰语、德语、意大利语、葡萄牙语等 ISO-8859-1使用单字节编码兼容ASCII编码。
8.4 GBxxx字符集 GB就是国标的意思是为了显示中文而设计的一套字符集。 GB2312简体中文码表。一个小于127的字符的意义与原来相同即向下兼容ASCII码。但两个大于127的字符连在一起时就表示一个汉字这样大约可以组合了包含7000多个简体汉字此外数学符号、罗马希腊的字母、日文的假名们都编进去了这就是常说的全角字符而原来在127号以下的那些符号就叫半角字符了。 GBK最常用的中文码表。是在GB2312标准基础上的扩展规范使用了双字节编码方案共收录了21003个汉字完全兼容GB2312标准同时支持繁体汉字以及日韩汉字等。 GB18030最新的中文码表。收录汉字70244个采用多字节编码每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字同时支持繁体汉字以及日韩汉字等。
8.5 Unicode码 Unicode编码为表达任意语言的任意字符而设计也称为统一码、标准万国码。Unicode 将世界上所有的文字用2个字节统一进行编码为每个字符设定唯一的二进制编码以满足跨语言、跨平台进行文本处理的要求。 Unicode 的缺点这里有三个问题 第一英文字母只用一个字节表示就够了如果用更多的字节存储是极大的浪费。 第二如何才能区别Unicode和ASCII计算机怎么知道两个字节表示一个符号而不是分别表示两个符号呢 第三如果和GBK等双字节编码方式一样用最高位是1或0表示两个字节和一个字节就少了很多值无法用于表示字符不够表示所有字符。 Unicode在很长一段时间内无法推广直到互联网的出现为解决Unicode如何在网络上传输的问题于是面向传输的众多 UTFUCS Transfer Format标准出现。具体来说有三种编码方案UTF-8、UTF-16和UTF-32。
8.6 UTF-8 Unicode是字符集UTF-8、UTF-16、UTF-32是三种将数字转换到程序数据的编码方案。顾名思义UTF-8就是每次8个位传输数据而UTF-16就是每次16个位。其中UTF-8 是在互联网上使用最广的一种 Unicode 的实现方式。 互联网工程工作小组IETF要求所有互联网协议都必须支持UTF-8编码。所以我们开发Web应用也要使用UTF-8编码。UTF-8 是一种变长的编码方式。它可以使用 1-4 个字节表示一个符号它使用一至四个字节为每个字符编码编码规则 128个US-ASCII字符只需一个字节编码。 拉丁文等字符需要二个字节编码。 大部分常用字含中文使用三个字节编码。 其他极少使用的Unicode辅助字符使用四字节编码。 举例
Unicode符号范围 | UTF-8编码方式
(十六进制) | 二进制————————————————————|—–—–—–—–—–—–—–—–—–—–—–—–—–—–0000 0000-0000 007F | 0xxxxxxx兼容原来的ASCII0000 0080-0000 07FF | 110xxxxx 10xxxxxx0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 8.7 小结 注意在中文操作系统上ANSI美国国家标准学会、AMERICAN NATIONAL STANDARDS INSTITUTE: ANSI编码即为GBK在英文操作系统上ANSI编码即为ISO-8859-1。
