数据类型&表达式
课程回顾:
定义一个类的语法: class 自定义类名
声明变量的语法: 数据类型 变量名;
主函数语法:public static void main (String[] args) {
打印语句: System.out.println();
- 课程介绍
===========
-
- 数据类型(掌握)
-
- 数据类型的转换(掌握)
-
- 表达式 (掌握)
-
- 运算符 (掌握)
2.数据类型的分类structure:
2.1 基本数据类型 * 8 (原生类型)
以下是Java预定义好的类型8个
- 整数类型
byte 8 [-128,127]
short 16 [-32768-32767]
int 32 [-2147483648,2147483647]
long 64
- 小数类型(浮点型)
float 32
double 64
- 字符类型
char 16
- 布尔类型
boolean 1
2.2进制的了解:推荐使用(除二取余法和分权求和法)
练习一个 87
代码:
class System01{
public static void main(String[] args) {
int n1 = 15;
int n2 = 017;
int n3 = 0xf;
二进制输出语句
System.out.println(n2);
System.out.println(n3);
System.out.printf("%o\\n",n2);//按8进制输出
System.out.printf("%x\\n",n3);//按16进制输出
}
}
2.3基本数据类型-整数类型
byte(8) short(16) int(32) long(64)
byte的范围 [-128,127]
2.4基本数据类型-浮点型(小数)
1、
float 32位 单精度
double 64位 双精度
任何的一个数据都是有一个默认类型的 浮点数默认类型是 double
System.out.println(3.14); 3.14的类型是double
3.0的类型是
double,现在在把一个double值赋值给float变量,float精度比double低一些,
感觉3.0小数位并没有多长,感觉float可以存储下的,为什么还报错呢?编译器只看类型
- float double 都不能够精确的表示一个小数
double d = 3.0 其实表示的是一个无限接近于3.0的一个数据
在一些精度要求比较高的领域使用float double 就不太好,例如上天、下海…
在后面学习一个精确的表示小数的一个类型 BigDecimal
- 小数的常见的表示形式
> ① 直接使用一个小数 3.14
> double d = 3.14;
> float f = 3.14f 或者 3.14F
② 使用科学计数法(了解)
> double d = 3.14e2;
> double d = 3.14e2; //3.14乘以10的2次方
> System.out.println(d); //314.0
> d = 3.14e-2; // 3.14除以10的2次方
> System.out.println(d); //0.0314
2.5基本数据类型-字符型
- 计算机中的单位:
bit比特 表示一位 1位==1bit
1 byte字节 = 8bit
1KB = 1024byte
1MB=1024KB
1G=1024MB
1T=1024G
-
char 16位(2个字节)
-
常见的几种表示形式
- 直接使用一对单引号 ‘1’ ‘a’ ‘在’…; ‘’ 中只能够写一个符号
最常用的表示形式
- 可以使用一个整数表示一个字符
例如现在我希望把 “好” 存储到计算机中?
设计到一个叫字符编码 : 假设我自己搞一套编码表
好 — 123
的 — 12345
吧 — 9527
- (了解)和iic差不多,’\uxxxx’ xxxx代表的是一个字符对应的数字的16进制表示形式
char c = ‘A’
c = 65;
// 65 —> 16进制 41
c = ‘\u41’ 编译报错,16进制的数据必须是4位,不足4位前面使用0补齐
c=’\u0041’
- 特殊的符号
在控制台输出一个 ‘
char c = ‘’’; 感觉可以吗? 单引号是有特殊意义的,会让编译混乱…
编译报错
可以使用一个转义符号把特殊的符号转义一下 \
char c = ‘\’’
想输入一个\
char c = ‘\’ 可以吗? \现在有特殊意义 转义
应该是: char c = ‘\\’;
\’ ---- ‘
\\ ---- \
\” ---- “
\t — tab
\r ---- 回车符
\n — 换行符
经常回车换行一起使用 \r\n
char表示16位的Unicode字符,Java对字符采用Unicode字符编码。Unicode收集了世界上所有语言文字中的字符,是一种跨平台的编码方式,Java的字符占两个字节,可以表示一个汉字,字符常量使用单引号
’ ’ 括起来。
char前256个字符和ASCII(美国信息交互标准编码)码中的字符重复,可查ASCII表
2.6基本数据类型-布尔型
boolean 1 它的值就只有两个 true false
boolean b = true;
在计算机的底层其实就是使用 0 1 表示和存储,但是Java中不能够直接把1 0
赋值给boolean类型的变量
boolean b = 1;
boolean一般用在什么地方呢?
一般就是一些条件判断,if for循环。。。
2.7引用数据类型 * n
- 类 一个类也就是一种类型
String 是Java中写好的一个类,也是一种类型,描述的是字符串
String str = “ksdfj”
class A{}
A xx = ? // 面向对象的时候给大家说值是什么 就是对象
-
接口
-
枚举
-
数组
。。。。。等等等等
引用数据类型-简单了解String (注意思维的转变)
- 包括类、接口、枚举、数组…
> 既然类就是一个引用类型
> String s;
> 自定义一个类:
> class Hello{}
> Hello h;
- 目前简单了解String
> String 是Java中写好的一个类,也是一个类型,表示字符串
> String s = “akdh”;
> String s = "Hello 高薪!";
> System.out.println(s);
> 定义一个String;
- 字符串的链接效果 +
> 字符串和任意的其它类型的数据使用 + 都表示连接
> String s1 = "Hello";
> String s2 = "高薪";
> System.out.println(s1+s2);
> System.out.println(s1+5); // Hello5
> int i = 5;
> System.out.println(s1+i); //Hello5
> System.out.println('A'+'B'); //?
> AB : 感觉连接了? 没有字符串,+ 不是连接的作用
> 6566 : 感觉还是连接,只是连接是数字
> 131 : 正确:
> 原因: byte short char 在参与算术运算的时候会自动类型提升为int
!
2.8数据类型过长和溢出
1、
byte b = 128; 直接编译报错,超出范围装不下
2、
byte b1 = 3;
OK,细想应该报错啊,3的类型是int,把int存储到byte中为什么不报错呢?
原因: 只要后面的值在byte的范围内,编译器会自动的隐式转换int i = 3;
byte b = i; // 编译报错,编译的时候报错
原因:
编译器在编译的时候看到是把一个int类型的变量赋值给byte类型,而编译器不知道变量i中的值是多少,只看到类型不匹配
3、
int i = 3;
double d = i; // OK的 d中是按照double的形式存储3会有小数的部分
int j = d; // 编译报错,编译器看到是在把一个double赋值给一个int
3类型转换(目前只针对基本类型)
基本数据类型的数字类型,可以把char当成一个数字使用
byte8 short (char)16 int32 long64 float32 double64
--------------------------------------------------------------------------------------》
从左到右,精度越来越高
疑问: float 和 long的位置
测试代码:
long a = 3.14f; 编译报错,可能有精度损失
float f = 123L; 编译OK
结论: float的精度比long更高
浮点型和整型存储方式不一样,不能够单纯的从位数来看
① 示例:
int i = 1;
double d = i; // 表示把变量i中的值复制一份,存放到d变量中
② 可以把低精度的直接赋值给高精度的变量 — 自动类型转换
double d = 123;
③ 特殊情况:
3.1强制类型转换
①单个类型强制转换
②多个类型强制转换
为什么不能写成(byte)n1+(byte)n2+(byte)n3?
-
语法规定转换符只能写在规定的位置
-
有运算符不能强制转换
③String引用类型和 int之间也经常强转
3.2自动隐式转换
3.3强制隐式转换
4.表达式
> 表达式 : 就是由一系列的 常量, 变量,运算符,() 等组成的一个算式
> 例如:
> 3+2-5;
> int a = 5; ==
> double d = 1.456;
> byte b = 22;
> a + (d - b) \* 10 / 3
> 我们写一个表达式的作用(目的)是啥?
> 按照一定的规则计算出一个结果值
> ? xx = a + (d - b) \* 10 / 3 // 表达式的结果值我们应该使用什么类型来接收
> double xx = a + (d - b) \* 10 / 3;
> 表达式的结果值的类型 : 整个表达式中精度最高的类型
> 测试:
> byte b1 = 3;
> byte b2 = 5;
> ? b3 = b1 + b2;
> 应该使用int 而不是byte: byte short char 在参与运算的时候会自动类型提升为 int
5.运算符&运算
运算符就是一种特殊符号,用来表示数据的算数运算、赋值运算、比较、逻辑运算、位运算、三目运算、等操作,常见的分类有如下几种。
5.1算数运算(ArithmeticOperators)
+ - * / % ++ - -
5.2 +
-
表示加法运算
-
字符串的连接 : +符号的两边至少有一边是字符串的时候才是连接
‘A’ + ‘B’ --> 131
- 表示正数,一般省略不写
5.3 -
-
表示减法运算
-
表示负数
5.4 *
-
表示乘法运算
-
正则表达式中表示匹配所有
5.5 /
-
表示除法运算
-
特点:
System.out.println(10/3); // 3 原因: 10 3
都是int类型,表达式的结果也是int类型(参考上面的表达式的部分内容)
5.6 %
- % 表示取模(求余数)
> System.out.println(10%1);
> System.out.println(10%2);
> System.out.println(10%3);
> System.out.println(10%4);
> System.out.println(10%5);
> System.out.println(10%6);
> System.out.println(10%7);
> System.out.println(10%8);
> System.out.println(10%9);
> System.out.println(10%10);
> System.out.println(10%11); // 10
> // 接下来的东西玩玩而已: 一般模运算都是整数
> System.out.println(11.11%11); //
5.7 ++ –
-
++ 表示自增; – 表示自减
-
回顾上面的其它的运算符(+ - * /)都是需要两个操作数,++ – 只需要一个操作数
-
++ – 只能够应用于变量,不能用于常量
5++ 错误的;
int i = 3;
i++; 正确的
- 基本语法规则
int i = 3; // 表示把3赋值给变量i,此时i变量盒子中的数据就是3;
i++; // 表示变量i的值会在之前的值的基础上自动增加1,它的值此时是4;
++i; // 表示变量i的值会在之前的值的基础上自动增加1,它的值此时是 5;
-
偶尔可能会见到的写法
int i = 3;
int j = i++;
System.out.println(“i=”+i); //4 3
System.out.println(“j=”+j); //3 4
6、偶尔可能会见到的写法
int i = 3;
int j = ++i;
System.out.println(“i=”+i); //4
System.out.println(“j=”+j); // 4
- 开发中几乎不会看到的写法
int i = 3;
i = i++;
System.out.println(“i=”+i); // 3
int i = 3;
i = ++i;
System.out.println(“i=”+i); // 4
1. 变态版
int a = 3;
int b = a++ + a++ + a++;
int c = ++a + ++a + ++a;
a =
b =
c =
5.8赋值运算(AssigningOperator)
1、 = += -= *= /= %=
2、赋值运算符的特点: 把符号右边的值赋值给左边,运算优先级很低
3、请把 += 看成是一个符号,不要看成是两个符号
4、具体的规则:请看示例
> int a = 6;
> a += 4; // 表示累加; 表示在a原来的值(6)的基础上累加一个4 ,结果值10
> // 也可以看成是 a = a+4;
> a -= 2; // a---8 也可以看成是 a = a-2;
> a \*= 10 // 80
> a /= 5 // 16
> a %= 2 // 0
- 注意1 : 如果一个变量没有值(局部变量)是不能够直接+=这样赋值
> int a;
> a += 2; // 编译报错
- 经历了多年的面试题
> int a = 3;
> a += 2;
> System.out.println(a) ;
> 上面的代码也可以写成:
> int a = 3;
> a = a + 2;
> System.out.println(a) ;
5.9比较运算(ComparisonOperators )
== != > < >= <=
instanceof(面向对象部分讲解)
-
比较运算的结果都是布尔类型、
-
== 比较两个数据是否相等
-
。。。
-
instanceof 判断一个数据是否是某种类型
① 仅仅用于引用数据类型,不能够用于基本数据类型
② 示例:
int a = 5;
a instanceof int
想判断a变量是否是一个int类型,但是不能够用于基本类型编译报错
正确的用法:
String str = “看卡时间的话”;
boolean b = str instanceof String ;
判断str变量的类型是否是String(判断str是否是String的实例)
6逻辑运算(LogicalOperators)
- 逻辑运算符有如下:
& 逻辑与 相当于 and 并且 两边都为true结果为true
| 逻辑或 相当于 or 或者 只要有一边为true,结果true
&& 逻辑与(双与) 相当于 and 并且 两边都为true结果为true
|| 逻辑或(双或) 相当于 or 或者 只要有一边为true,结果true
^ 异或 两边不一样结果true,否则为false
! 逻辑非 把true变成false 把false变成true
-
简单理解: 多条件组合使用
-
看场景:
小明本次考试Java,JS
如果小明本次考试 Java 和 JS都是100分,奖励一台电脑;
如果小明本次考试 java 或者 JS 是100分,奖励源码时代代金券 5000元;
把上面的场景使用伪代码表示:
int java = 100;
int js = 99;
如果 java==100 并且 js == 100 ----> 奖励电脑
if(java==100 & js == 100)
如果 java==100 或者 js == 100 ----> 代金券5000
if(java==100 | js == 100)
-
逻辑运算符两边一般都是boolean类型 (!只有一边)
-
逻辑运算的结果值类型 :boolean
-
& VS &&
| VS || 他们的区别(重点,必须要清楚)
① && || 只可以是逻辑运算
& | 可以是逻辑运算符也可以是位运算符
哪如何区分呢? 看两边的类型
② && || 具有短路行为
什么时候会短路:如果左边的条件能够确定整个表达式的结果值,那么右边就不运算了
&& : 左边为false短路
|| : 左边为true短路
(1==2) && (3==3) // 左边是false,断定结果肯定是false,所以右边不会执行运算了
(1==2) & (3==3) // 没有短路行为,两边都需要计算执行
③ 问题 : 我们怎么验证它短路了?
思路1: 可以在右边使用一些自增的语句,从结果来看值的变化
思路2: 右边部分中包含一个错误(异常)
7(暂时属于了解内容)位运算符(BitOperator) 按照数字的二进制位进行操作(了解)
& 两个位都为1 结果为1 否则0
| 只要有一位为1 结果 1
^ 1-0 0-1 结果都为1 否则为0
~ 按位取反 1–》0 0–》1
<< 把二进制位向左移动
>> 把二进制位向右移动
>>> 无符号向右移动
如果涉及到负数:原码 补码 反码 (建议暂时不用管)
8三目运算(TernaryOperator) 或者 三元运算
语法格式:
X ? Y : Z
X:可以代表是boolean值,或者运算结果为boolean值
列子:
若X为true,那就返回Y值,若不为true就返回Z的值
若你要以变量存储,那么Y与Z必须返回同种类型
6课程总结
数据类型(小数,字符,布尔类型,字符串)
数据类型的转换
运算符(++ --)
三目运算