Java语言基础
关键字
标识符
由26个字母,数字,以及两个符号_$组成
命名规则:数字不可以开头,不可以用关键字
注释
单行注释://直到一行结束
多行注释:/*内容 */
文档注释:java所特有的,/**内容 */,可以用java工具提取
注释可以用来缩小程序bug的范围,注释不占class文件的字节
java程序都是以类的形式存在的
常量与变量
常量的分类
- 整数常量
- 小数常量
- 布尔型常量(True or Fales)
- 字符常量 一个数字、字母或者符号用单引号标注
- 字符串常量 将一个或多个字符用双引号标注
- null常量
八进制用0开头,十六进制用0x开头
10101110-----0256(八进制)
10101110----0xAE(十六进制)
1byte(字节)=8个二进制位(bit位)
变量
概念:
- 内存中的一个存储区域
- 该区域有变量名和类型
- 区域内的数据在同一类型范围内可以不断变化
基本数据类型:
- 数值型
- 整数类型 byte(一两的碗/8bits,-128~127);short(二两);int(四两);long(八两)
超出数据类型的范围可能会损失精度(用一两的碗盛二两的米饭,称之为溢位)
负数的表示:首位取0 ;如10000101表示-5
- 浮点类型
float(32bits);double(64bits,默认,精确度更高)
- 字符型 char(值域为0~65535,两个字节,值可以为字符,一个中文为两个字节)
- 布尔型 boolean
定义变量:数据类型 变量名=初始值
- eg:byte b=3
- short c=2000
- long n=1222343553l(数值很大时最后要以字母l结尾)
- float m=2.3f(因为小数默认为double型,所以float命名最后要加f)
- double e=2.24
- char k=‘ch’;char xy=‘12’(注意要用英文符号)
- boolean b=true
自动类型提升
不同数据类型之间可以运算的前提是两者都是数值
int x= 3;
byte b=5;
x=x+b;
将byte类型提升为int,称为自动类型提升,这里x为四两的碗,x+b为四两的饭,不会溢位
强制类型转换
int x=3;
byte b=5;
b=x+b;
这里b为一两的碗,容纳不了四两的饭(x+b)
我们要进行的操作是 b=(byte)(x+b);称为强制类型转换
Tips:
- 尽量不要强制类型转换,可能丢失数据
- ‘a’+1=98,why?
ASCII表中a表示为97,A表示65,汉字也有对应的数字,参照unicode国际标准码表 - 一个有趣的小细节:
byte b=4;
b=3+4;
运行程序b=7,没有问题
byte b1=3;
byte b2=4;
b=b1+b2;
报错:可能损失精度
原因:b1,b2的取值不确定,若b1+b2>127,则会超出byte所能容纳的范围,将它赋给b会损失精度。
- int x=Integer.MAX_VALUE;可以查出int取值范围的最大值
原码、反码和补码
- 原码:在数值前加一个符号位的表示法
(+5)00000101;(-5)10000101 - 反码:
正数的反码和原码相同;
负数的反码,符号位为1,数值部分取反,(+0)00000000;(-0)11111111 - 补码:
补码是一种循环计数系统,类似于钟表,模就是循环计数系统中所表示的最大数,对于8位二进制数,模为256。
举个例子(-6)和(250)对模256互为补数,同余数。也就是说-6的补码就是250的二进制形式,即1111 1010。
正数的补码为原码,负数的补码为:负数的原码符号位不变,数值位取反后+1。
补码可以将减法转换为加法运算。
eg.求37-23?化为37+(-23),求出37和-23的补码进行加法运算,可以得出正确结果。关于补码更加详细的解释见:https://blog.youkuaiyun.com/studyvcmfc/article/details/7605752
运算符
- 算术运算符 + - * / %(取余,模运算) +(连接符)
int x=6345;
x=x/1000*1000;
x=6000,因为6345/1000=6.345,计算机会把小数部分去掉
5%2=1;5%-2=1;2%5=2
System.out.print(3+"2");--->32,这里的+表示连接符
又如:System.out.print("5+5="+5+5)--->5+5=55,过程是这样的,“5+5=”+5+5-->“5+5=5”+5-->"5+5=55"-->5+5=55
++(自增运算):
int a=3,b;
b=a++;--->a=4,b=3
b=++a;--->a=4,b=4
原理:a在前面则先将a赋给b,++在前面则先进行自增运算。
代码解释如下:
b=a++;
temp=a; //将a原来的值3存到一个临时变量里
a=a+1; //然后a进行自增运算结果为4
b=temp; //将临时变量的值3赋给b.
- 赋值运算符
(= 、 += 、-= 、 *= 、 /= 、 %=)
short a=3;
a+=4;----->a=7
a=a+4;----->报错,可能损失精度,原因还是可能发生溢位,a+=4可以运行是因为+=是一次赋值运算,会做自动类型转换,类同于short a=3也进行了类型转换
- 比较运算符
运算完的结果为true or false
System.out.print(3>2);---->true
- 逻辑运算符(用于连接两个boolean类型的表达式)
①&:与 (判断,一假为假)
②|:或(一真为真)
③^:异或(相同为假,不同为真)
④!:非
⑤&&:双与(判断方式与单与一样,唯一区别左边为假时右边直接不运算)
⑥||:双或(判断方式与单或一样)
- 位运算符
&(6&3=2)
|(6|3=7)
^(6 ^ 3=5;6 ^ 3 ^3=6)
。<<:左移(相当于乘以2的倍数)3<<2=322=12(右移两位,乘以2的2次幂)
。>> :右移(相当于除以2的倍数)3>>1=3/2=1
。>>>:无符号右移(同上)
练习
如何高效地运算2*8?
2<<3(位运算更高效)
对两个整数变量的值进行互换
int a=3,b=5,c;
c=a;
a=b;
b=c;(使用第三方变量)
或者
a=a^b;
b=a^b;
a=a^b;(利用两次异或同一个数会变成原来的数)
- 三元运算符
(条件表达式)?表达式1:表达式2;如果条件为true,运算后的结果是表达式1,反之为2.
int x=3,y=4,z;
z=(x>y)?x:y;
如何获取三个整数中最大的整数?
int a,b,c;
int temp = a>b?a:b;
int max = temp>c?temp:c;
2019/7/14