前言
第一天还是带着兴奋的,不是特别困,不过晚上回来1点就睡了,开学以来睡得最早的一次没有之一!!
今天就不一样了,早上不困,中午还清醒,可到了下午就奔溃了,持续晕乎了一个小时,不过没睡着。教训中午还是要趴着睡觉的,很管用的!!
进制转换
任意进制—转换为十进制
位权展开发(d^n)
十进制----转换到任意进制
口诀:除积取余,商为零,余数反转。
源码 反码 补码
源码:最高位为符号位,“0”为正,“1”为负,其余位表示数值大小。
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
变量
含义:在程序执行的过程中,在某个范围内其值可以发生改变的量(例如:苹果的价钱),变量其实是内存中的一小块区域
为什么要定义变量:
用来不断的存放同一类型的常量,并可以重复使用;
变量的定义格式:
数据类型 变量名 = 变量值 ;
为什么有数据类型:
变量是内存中一小块区域,用数据类型规定开辟内存区域的大小;
Java数据类型的分类
包括:基本数据类型 和引用数据类型
基本数据类型
(1): 数值型
整数型 字节数 范围
byte 1(8bit) -128 ~ 127
short 2(16bit) -2^15 ~ 2^15 - 1
int 4(32bit) -2^31 ~ 2^31 - 1
long 8(64bit) -2^63 ~ 2^63 - 1
浮点数
float 4(32bit) -3.403*10^38 ~ 3.403*10^38
double 8(64bit) -1.798*10^308 ~ 1.798*10^308
(2): 字符型 char 2(16bit) 0 ~ 2^16 - 1 = 65535
(3): 布尔型 boolean 1
整数默认是int类型的 , 浮点数默认是 double类型的
注意:long 10L;和float 1.1F 因为有默认
byte a=10;
short b=20;
long num=10L;
float f=1.1F;
double dd=1;
使用变量注意事项
- 变量在使用之前必须赋值。变量必须先赋值后使用
- 重写赋值,会覆盖掉旧值
- 在同一个作用域里面不能定义两个同名变量(大括号的范围就是这个变量的作用域)
- 在一行上建议只定义一个变量可以定义多个,但是不建议;
数据类型的隐式转换
自动类型提升:byte short char 在参与数学运算时,会自动提升为int类型,如果还有long ,float double 参与运算则会相应的提升为 long float double ,布尔类型不参与数学运算,byte short char 之间不发生转换
boolean类型不能转换为其他的数据类型;
数据类型的强制转换
强制类型转换:强制将一个数据,转换成我们要的数据类型,强制类型转换,有可能会发生精度损失的问题
class Demo3{
public static void main(String[] args) {
byte a=1;
byte b=127;
short r=(short)(a+b);
System.out.println(r);
}
}
Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
答案:可以,Java语言采用Unicode编码的,其每个字符占两个字节,每个汉字需要两个字节。
自动位提升和常量优化机制
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
byte b4 = 3 + 4;
class Demo123
{
public static void main(String[] args)
{
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
System.out.println(b3);
}
}
class Demo123
{
public static void main(String[] args)
{
byte b4=3+4;
System.out.println(b4);
}
}
分别运行会发现b3出错,b4正确。原因:b1和b2相加运算自动位提升为int 类型,而b3 为float放不下提示出错; b4不会报错 原因:常量优化机制,多个常量相加时,他会先算出结果,看没有在这个数据类型的范围内,如果在,就不报错,如果不在就会报错
字符字符串参与运算
+号,可以当做一个数学运算符来用,其相加的作用,其还可以起另外一个作用,当连接符来使用。
当+号运算两端只要任意一端是一个字符串,那么加号就起连接符的作用,就会将两端的内容拼接起来,形成一个新的字符串
class Demo6{
public static void main(String[] args) {
System.out.println("Hello World!"+100); //"Hello World!100"
System.out.println("Hello World!"+100+33);//"Hello World!10033"
System.out.println("Hello World!"+"10033");// "Hello World!10033"
System.out.println(100+"Hello World!");//"100Hello World!"
System.out.println(100+"Hello World!"+100+33);//100Hello World!10033
System.out.println(100+11+"Hello World!"+100+33); //111Hello World!10033
System.out.println("5+5="+5+5);//"5+5=55"
System.out.println(5+5+"=5+5");//"10=5+5"
}
}
算数运算符基本用法
含义: 对常量和变量进行操作的符号称为运算符
分类:
算术运算符: + , - , * , / , % , ++ , –
赋值运算符
比较运算符
逻辑运算符
位运算符
三元运算符
算数运算符
- 整数相除只能得到整数。如果想得到小数,请使用浮点数
- /获取的是除法操作的商,%获取的是除法操作的余数
- %运算结果的符号,取决于参与运算是左边的符号
class MathYSF{
public static void main(String[] args) {
int a=10;
int b=3;
System.out.println(a/2); //5
System.out.println(a/b); //两个整数相除如果不能整除取,取的是商
System.out.println(a%b); //取余数
}
}
++ --运算符的使用
++(自加):对原有的数据进行+1
–(自减):对原有的数据进行-1
注意:
1.单独使用:
放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)
2.参与运算使用:
放在操作数的前面,先自增或者自减,然后再参与运算。
放在操作数的后面,先参与运算,再自增或者自减。
class MathYSF{
public static void main(String[] args) {
int num=1;
num++;
++num;
num--;
--num;
System.out.println(num);
}
}
答案:1
class MathYSF{
public static void main(String[] args) {
int num=1;
int rr=3+(num++)-1+(num--)+1+(++num)+2+ (++num)+10;
System.out.println(rr);// 23
System.out.println(num);//3
}
}
最终输出:rr=23,num=3
赋值运算符
包括: =, +=,-=,*=,/=,%=;
class FZYSF{
public static void main(String[] args) {
byte num=10;
num+=100;//num=num+10等价于num+=10; 累加
System.out.println(num);
}
}
答案:110
注意:会自动帮你强制类型转换,它会判断累加完的结果,在不在这个数据类型的范围内,如果不在会自动帮你强制类型转换
比较运算符
包括: == ,!= , < , > , <= , >= , instanceof
注意
比较运算符的等于是==不是=!!
结果都是boolean类型
class BJYSF{
public static void main(String[] args) {
int a=10;
int b=20;
boolean flag=a==b;
//flag=a>b;
//flag=a<=b;
//flag=a!=b;
System.out.println(flag);
}
}
答案分别是;
false false ture ture
逻辑运算符
包括:&(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)
注意逻辑运算符一般用于连接boolean类型的表达式或者值。
在Java中我们要表示一个数大于3并且小于6 ,不可以写成3<x<6,应该写成 x>3 & x<6 。
逻辑运算符的基本语法
! 取反 true变false false 变true
& 运算两端,只要任意一端是false 其最终结果都是false 只有两端都位true最终结果才是true
| 或者 运算两端只要任意一端,为true 其最终结果都是true,只有两端都是false其最终结果才是false
^(异或) 不同为true相同为false
** // &(并且) , |(或者) 和 &&(短路与) , ||(短路或) 的区别**
class LJYSF {
public static void main(String[] args) {
int a=10 ;
int b=20;
boolean flag=a==10&&(b++)>10; //& 两端都需要运算 && 只要左端为false 右端不需要运算,只有左端为true 右端会去运算
System.out.println(flag);
System.out.println(b);
int a=10 ;
int b=20;
boolean flag=a==10||(b++)>10; // | 两端都需要运算,|| 只要左端为true 右端就不需要运算,只有左端为false 右端还是要运算的
System.out.println(flag);
System.out.println(b);
}
}
位运算符
包含:&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
注意位运算是直接对二进制补码进行运算。
值交换:
class ValueChange{
public static void main(String[] args) {
int a=10;
int b=20;
//让两个变量的值进行交换
//重新赋值
//a=20;
//b=10;
//方式1 采用中间变量来做 开发中常用,需要掌握
int t=a;
a=b;
b=t;
System.out.println("a是:"+a);
System.out.println("b是: "+b);
//方式2 一个数被另外一个数位异或两次,该数不变
/*
a=a^b;
b=a^b; //b=a^b^b
a=a^b; //a=a^b^a
*/
//方式3
/*
a=a+b;
b=a-b;
a=a-b;
*/
//方式4
//a=(a+b)-(b=a);
System.out.println("a是:"+a);
System.out.println("b是: "+b);
}
}
提倡用中间值进行交换即方法一最常用。
三元运算符的基本用法
三元(三目)运算符的格式
(关系表达式) ? 表达式1 : 表达式2;
int a=(10>20)?30:50;//a=50
三元运算符的执行流程
计算关系表达式的值,如果为true, 运算后的结果是表达式1; 如果为false,运算后的结果是表达式2;
class SanYuanYSF{
public static void main(String[] args) {
//求三个数的最大值
int a=10;
int b=20;
int c=100;
int max=a>b?a:b;
int maxmax=max>c?max:c;
System.out.println("最大值是"+maxmax);
}
}
注意三元表达式不建议嵌套,阅读性不好