笔记之java基础-02
1、常量分类:
A:字面值常量
1)整数常量 123 -234
2)实数常量 123.5
3)字符常量:用单引号括起来的数据 ‘A’,'a''2'
4)字符串常量:用双引号括起来的数据“hello world”
5)布尔常量: true false
6)空常量:
B:自定义常量
2、进制
1)字节数据是计算机表示(存储和传输)的最基本单位。
1个二进制数据被称为位 bit,1字节type=8 bit
1k=1024byte
1H=1024k
1G=1024H
1T=1024G
1个汉字占2个字节。
2)进制之间的转换
10进制到2进制:倒叙取余法
二进制到八,十六进制:
基本做法:二进制--十进制--十六or八进制
简单做法:二进制到八进制,三位一组 110 101 111=657(八进制)
二进制到16进制 ,四位一组1101 0010 1011=D2B(十六进制)
八or十六进制到2进制:每位转换成3位或者4位的数
657(八进制)=110(6)101(5)111(7)
3)有符号数据的表示,原码,反码,补码
在计算机中数据是以补码形式存储的。最高位是符号位,其他位是数据位
反码:正数的反码和原码相同,负数的反码是原码除去符号位,其他数值位取反,0变1,1变0.
补码:正数的补码和原码形同,负数的补码是负数的反码+1.
在计算的时候,符号位也会参与计算,超出后舍弃。
3.变量:
1)变量是内存中的一个存储区域
2)该区域有自己的名称(变量名)和类型(数据类型)。
3)该区域的数据可以在同一类型范围内不断变化。
为什么定义变量:用于不断地存放同一类型的常量,并可以重复使用。
4.数据类型
java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
类型 占用存储空间
Byte 1字节
Short 2字节
Int 4字节
Long 8字节
Foloat 4字节
Double 8字节
整型默认int型,字符型默认double型
java浮点型有两种表示方式:
十进制数形式 3.14
科学计数法: 3.14e2=3.14*10^2
//定义长整型,必须加后缀L,因为默认整型
//定义单精度的时候必须加后缀,F或者f,否则可能损失精度。
5.java中的类型转换:
注意:在运算的过程中一般要求类型一致,如果遇到类型不一致的情况,就会有报错 。
类型转换怎么做的:
A:boolean类型不可以转换为其他的数据类型。
B:隐式转换,(从小到大)
Byte,short,char---int--long--float--double
注意:long是8个字节,float是4个字节但是long可以转换到float,原因是整数和浮点数的存储规则不一样。
例: byte a=10;
int b=a;
System.out.println(b);
C:强制转换
如果明确知道数据是可以表示的,则可以强制转换
格式:(转换后数据类型)变量或者数值
注意:一般情况下不推荐使用强制转换
例:int a=4;byte c=3;
byte d=(byte)(a+c);
System.out.println(d); //因为明确a+b = 7的值可以用byte值表示。
class VariableDemo3{
public static void main(String[] args){
byte b=126;
System.out.println(b);
byte b2=(byte)130;//输出结果为-126.
System.out.println(b2);
byte b3=(byte)300;
System.out.println(b3);
}
}
1. 数值在内存中默认是int型的,byte占一个字节8位数,表示数值范围为-128--127.
当定义byte b=126,在范围内可以直接输出。
分析如下:126在内存以如下形式存储:
00000000 00000000 00000000 01111110
做byte b=126后,截取后8位即b的存储方式是:01111110然后输出,并没有改变数值大小
2.当定义byte b2= 130;
130在内存中的存储形式是:00000000 00000000 00000000 10000010
做强制转换截取后8位,是10000010;
原码:10000010
反码:11111101
补码:11111110
最终结果为:11111110
3.当定义byte b2= 300;
130在内存中的存储形式是:00000000 00000000 00000001 00011100
做强制转换截取后8位,是00011100;
原码反码补码都是00011100
故最后结果是44.
6.面试题
面试题:下面的语句有没有错误,如果有请解释:
byte b1=3;
byte b2=4;
byte b3=b1+b2;
byte b4=3+4;
有问题,在 byte b3=b1+b2;时报错
解释:
b1+b2在做运算时首先会自动转换成int类型,byte short char在做运算首先自动转换成int类型
在这个时候b1,b2会提升为Int类型。
最终相当于直接把int类型赋值给byte类型。
如果参与运算的是常量,编译器会先计算值再看该值是否是左边类型可以表示的范围,与变量不同
变量是只要做加法就自动转为int类型。若是常量先计算然后赋值,若结果在范围内不报错,
若结果不在范围内则报错
7.运算符:
运算符:把变量和常量进行连接的符号
分类:
算术运算符
赋值运算符
关系运算符
逻辑运算符
位运算符
三元运算符
1)算数运算符:+ — * /
除法:整数/整数=整数,若要保持小数形式,则被除数或者除数必须有一个为浮点型。
%取余运算
左边的数据大于右边,结果是余数
左边的数据小于左边结果是左边
左边等于右边结果为0
符号与左边一致
System.out.println(-5%3);//结果为-2
System.out.println(5%-3);//结果为2
System.out.println(-5%-3);//结果为-2
++ --
1)单独使用时,++i 与i++效果一致
2)如果++或者(--)放在操作数的后面,操作数据先操作,在++
3)如果++(--)放在操作数的前面,先++,再赋值。
4)int x=3;
int y=x++;
System.out.println(x); //x=4
System.out.println(y);//先执行y=3,在执行3++,y=3
int z=++x;//先执行++4,再执行z=5;
System.out.println(z);
+的特殊用法
+可以作为字符串的连接符,会按照从左到有的顺序链接
若是先遇到字符则直接连接,若是先遇到数字则先计算在连接。
String s="hello"+5+5+5+5; //输出结果为hello5555
String s=5+5+"hello";//输出结果为10hello
System.out.println(s);
2)赋值运算符=,+=,-=,*=,/=,%=
int a = 10;
把10赋值给int类型的变量a。
a += 20;
把左边和右边的和赋值给左边。
注意事项:
a = a + 20;
a += 20;
结果是等价的,理解不是等价的。
因为+=这种运算符,内含了强制类型转换功能。
比如:
short s = 2;
s+=3;
等价于
s = (short)s + 2;
3)关系运算符
==,!=,>,>=,<,<=
特点:关系运算符的结果都是boolean类型。
请千万注意:== 不要写成 =
分隔符:";" 表示语句结束,可以在一行上写多条语句,但是,建议一行上只写一条语句
空格:关键字前后必须有空格,在运算符两端可有可无,建议有
4)逻辑运算符
&,|,!,^,&&,||
&:有false则false|:有true则true
!:true变false,false变true
^:相同false,不同true
&&:有false则false
||:有true则true
如果从结果看,单&和双&,单|和双||一样,那么区别在哪呢?
&&前面出现了fause后面将不再执行,而&不管前面是true还是fause,后面都执行
||前面出现true后面将不再执行,而|不管前面是true还是fause,后面都执行
开发中常用:
&&,||,!(s+3);
5)位运算符(了解):对二进制码进行运算
<< 左移
>>右移
>>>无符号右移
&与运算 两边是布尔类型的表达式则为逻辑运算符,两边是数据则为位运算符
|或运算
^异或运算
^ : 一个数据对同一个数据^两次,结果还是数据本身。
举例:a ^ b ^ b = a
面试题
请把两个数据交换
举例:
int a=10;
int b=20;
开发使用第三方变量的形式,面试使用^的形式
a = a^b;
b = a^b;
a = a^b;
System.out.println(a);//a=a^b^a=b,把b赋给了a,
System.out.println(b);//b=(a^b^b=a),即b=a,把a赋给b
~反码
向左移动或者向右移动就是把数据增大或者缩小2的指定次幂,左移是高位舍弃,右边补0
System.out.println((-16)<<2);//(-16)*2^2=-64 若最高位是1,左移完了后最高位仍然是1
向左移动或者向右移动就是把数据增大或者缩小2的指定次幂,如果最高位是0,左移后最高位还是0
如果最高位是1,左移后最高位还是1,即相当于最高位的1不移动,总的来说就相当于乘以2的倍数
右移稍微复杂点,如果最高位是0,左边被移空的位置就补0。如果最高位是1,左边被移空的位置就补1,
但是右移时最高位的1不会移动,总的来说就相当于除以2的倍数
>>> 无符号右移
6)条件运算符格式:
条件表达式?表达式1:表达式2
执行流程:
根据条件表达式返回的是true还是false,决定结果是什么。
如果是true,就把表达式1作为结果。
如果是false,就把表达式2作为结果。
举例:
int a = 100;
int b = a > 50 ? 200 : 100;
请问b的值?200