1. 什么是变量
变量所承载的内容就是计算机的一些相关数据
例:int age=20; 数据类型 变量名称 = 具体的值;
变量一般存储在内存当中
在java中定义有两种
局部变量:在方法中定义的变量 作用域:方法中访问
成员变量:在类的里面方法的外面定义的变量 作用域:整个类
在java中没有全局变量的说法
在同一作用域内不能出现同名变量
2. 数据类型有哪些
基本数据类型 (1)不是基本数据类型的就都是引用数据类型
(2)string类型不是基本数据类型 它是唯一一个可以作为常量来使用的引用数据类型
分类:
数值型:
整数:
byte 字节型 一个字节相当于8个bit 00000001 取值范围-128到127 默认值0
short 短整型两个字节 16个bit 0000 0000 0000 0001
取值范围-32768到32767 默认值0
int 整型 四个字节32个bit 取值范围 -2的31次方到2的31次方-1 默认值0
long 长整型 八个字节 64个bit 取值范围 -2的63次方到2的63次方-1 默认值0L
常量的整数都是int类型
常量的浮点数都是double类型
见到大写的L那么它表示的意思是长整形
浮点数:
float 单精度 四个字节32个bit 取值范围 -3.40E+38到3.40E+38 默认值0.0
(E表示科学计数法 *10的38次方)
double 双精度 八个字节 64个bit 取值范围 -1.79E+308到1.79E+308
单精度和双精度的区别:
单精度能表示的有效位数为7位 双精度能表示的有效位数为16位
非数值型:
字符型 char 只表示一个字符 char =‘a’ 用单引号来表示
两个字节 16个bit 取值范围’\u0000’---‘\uffff’默认值 表示unicode码
英文一个字节汉字两个字节 默认支持ASCII码 数字0-9 码48到57
大写字母A到Z 码65到90
小写字母a到z 码 97到122 大小写转换相差32
布尔类型 boolean true false 一个字节 8个bit 默认值false
引用数据类型(复合数据类型)
不是基本类型都是引用数据类型
String字符串最特殊 它是引用数据类型但是能当做常量使用
面试题:为什么string不是基本数据类型
Java中string是个对相关,是引用类型。基础类型和引用类型的区别是,基本类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构,而string能当做常量用
变量的命名规范:首字母小写
不能使用java中的关键字
不能以数字开头
不能使用标点符号 除了$和_
驼峰标识
望文生义
姓名String 年龄int 性别 char 身份证号 String
编号id String int职业 String 金钱double 时间 引用数据类型
数据类型转换:
- 数字类型的转换
byte- short- int- long
int- float- double
b1 b2 的值可以变化
b3中知道了具体的值
b4中不知道b1b2相加后是否会超出byte的取值范围
所以会报错
所以要强制转换 byte b4 = (byte)(b1+b2);
char类型也这么用
- byte char boolean
以上三个类型之间不可以互相转换 byte和char类型之间要进行强制转换
char不能往浮点型转 因为char不支持浮点型
标识符
算数运算符 ±*/ %求于
数字带有负号怎么求于
-7%4=-3
7%-4=3
-7%-4=-3
7%4=3
求于时的负号跟着被除数走
递增和递减
i++ 先运算再+1
++i 先+1再运算
赋值运算符
= 赋值从右至左
+= -= *= /=
a+=b a=a+b
关系运算符 返回值Boolean true false 一般用于判断
大于 <小于 ==恒等 !=不等
if语句 while语句
逻辑运算符
&逻辑与 两个都是true才返回true a&b并列关系
&&短路与 如果a为false 则b表达式不参与运算 直接返回false
| 逻辑或 a|b 或者关系 有一个表达式返回true那么整个表达式就返回true
两个都返回false则返回false
||短路或 如果a为true 则b不参与运算 直接返回true
!逻辑非 !a即b 如果a为true !a为false
^ 逻辑异或 a^b 如果两个表达式的返回值相同则返回false
如果两个表达式的返回值不同则返回true
(相同出0不同出1,但java出false和true)
三目运算符
具有三个表达式
Xyz
x?y:z 判断x的返回值 如果x为true 执行y ,如果x为false 则执行z
位运算和移位运算
先把数字转换成二进制才能进行运算 运算速度比较快
正数的反码补码与源码相同
负数的源码为正数的源码符号位由0变成1
负数的反码为源码符号位不变其余位0变1,1变0
负数的补码=反码加1
-3的源码 1000 0011
反码 1111 1100
补码 1111 1101
按位与 & 5&13 同位为1时结果为1 否则为0
101
1101
0101 5 (两个都是true才返回true)
两个都是负数的按位与 -6&-7
用补码进行计算最后转换成源码输出
-6源码 1000 0110 -7源码 1000 0111
-6反码 1111 1001 -7反码 1111 1000
-6补码 1111 1010 -7补码 1111 1001
1111 1010
1111 1001
1111 1000 这是补码 转源码
1111 0111
1000 1000 -8
其中一个是负数的按位与 -5&7 负数用补码 正数用源码 输出不用转换
逻辑与和按位与的区别:
&&是逻辑与 即判断&&两侧的表达式是否都为真,都为真则此&&表达式为真
&是按位与 即将&两侧的数用二进制展开,每一位都求与运算,最后得到的二进制数为结果。
逻辑与结果只将真和假,而按位与得出的是实实在在一个数
按位或 | 同位 参与运算的两数各对应的二个二进制位有一个位1时,结果位就为1
5|13
101
1101
1101 13
其中一个数是负数的按位或 -5 | 7 负数用补码
正数用源码 最后输出要转换成源码 符号位不变
-5源码 1000 0101 7的源码 0000 0111
反码1111 1010
补码1111 1011
1111 1011
0000 0111
1111 1111 转反码(-1) 1111 1110 转源码1000 0001 -1 符号位不变
两个数都是负数时 -5 | -7
-5源码1000 0101 -7的源码 1000 0111
反码1111 1010 反码 1111 1000
补码1111 1011 补码 1111 1001
1111 1011
1111 1001
1111 1011 转为反码(-1)1111 1010 转源码 1000 0101 -5
按位异或 两个不同时为1
5^13
101
1101
1000 8
有一个数为负数时 7^-5 最后结果补码转换为源码
两个数都是负数时 -7^-5 最后结果不用转换
按位与 其中一个是负数 不转 两个都是负数 要转
按位异或 其中一个是负数 要转 两个都是负数 不转
按位或 两种都转
移位运算
<< 左移 a<<b 将数据a左移b位 右边的数字补0 越左移数字越大
System.out.println(2<<4);
System.out.println(3<<4);
10 0000 22的4次幂
11 0000 32的4次幂
右移 越右移数字越小
a>>b
2>>4 2*2的-4次幂
3>>4 3*2的-4次幂 移的数是奇数时还是转换成二进制计算因为会除不尽
负数的左移<< -9<<1 -9*2的1次幂
-9<<2 -9*2的2次幂
负数的右移>> 将补码进行右移 再反成反码再反成原码
-9>>1
-9源码:1000 1001
-9反码:1111 0110
-9补码:1111 0111
右移补码后
补码:
1111 1011
反码:
1111 1010 补码变反码减1
源码:
1000 0101 -5
无符号右移 按位右移补零操作符
左操作数的值按右操作数指定的位数右移,移动得到的空位以0填充。
A=60 A>>>2 即
0011 1100---0000 1111
三目运算符
条件运算符是右结合的,也就是说,从右向左分组计算。
例:a?b:c?d:e将按a?b:(c?d:e)执行 先算括号里再算外层
Java中保留的关键字