主要内容
- 变量
- Java数据类型
- Java数据类型转换
- 运算符
学习目标
- 掌握变量的定义、初始化、使用及注意事项
- 掌握Java基本数据类型的使用(4类8种)
- 掌握数据类型的转换及其中的注意事项
第一节 变量
1.1 概念
变量: 程序运行时候可以变化的量.
思考过没有, 变量用来干什么?
答案: 变量本质就是对"实际量
"的一个指代, 就是一个代词. 和我们在数学中见到的函数变量一样, 函数的本质是因变量随着自变量的变化而变化, 所以使用x,y之类的变量来表示这个变化的数; 编程中的变量也是同样道理.
1.2 变量的定义
概述: 在使用变量之前, 我们首先要在程序中告诉机器, 给我们创建一个什么类型的变量, 这个声明的过程也叫做变量的定义.
方式1(定义并初始化变量):
数据类型 变量名 = 值;
public static void main(String[] args){
System.out.println("定义变量的方式1: ");
//定义一个字符串类型的变量
String studentName = "小马哥";
//定义一个整形变量
int stuAge = 30;
}
方式2(先定义变量, 用的时候再初始化):
数据类型 变量名;
变量名 = 值;
public static void main(String[] args){
System.out.println("定义变量的方式2: ");
//定义一个字符串类型的变量
String studentName;
//定义一个整形变量
int stuAge;
/*
其它代码
*/
//变量初始化
stuAge = 30;
studentName = "小马哥";
}
1.3 变量的使用
变量定义和初始化的目的是为了使用的, 如何使用呢? 直接调用变量的名字.
//使用"定义并初始化"之后的变量: 打印
System.out.println("学员姓名: "+studentName);
System.out.println("学员年龄: "+stuAge);
1.4 注意事项
学习提示: 以下各个注意事项, 先自己测试思考总结到你自己的笔记上, 然后对比讲义的实验结果.
- 1,变量使用之前,必须初始化;
- 2,使用变量的时候,必须有这个变量;
- 3,变量在相同的作用域下不能重名;
- 4,在不同的作用域中,变量不能互相使用
- 5,变量可以同时定义,但是初始化赋值只能单独的
代码演示:
试验1: 使用变量前, 不进行初始化的后果
public class Demo03_warning1{
public static void main(String[] args){
// 1,变量使用之前,必须初始化;
String name;
System.out.println(name);
}
}
运行结果:
D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo03_warning1.java
Demo03_warning1.java:5: 错误: 可能尚未初始化变量name
System.out.println(name);
^
1 个错误
结果解释:
Demo03_warning1.java:5: 错误: 可能尚未初始化变量name
代表在 Demo03_warning1.java
文件的第 5
行代码出现错误
试验2: 使用变量之前, 没有定义变量的结果
public class Demo03_warning2{
public static void main(String[] args){
//2,使用变量的时候,必须有这个变量;
System.out.println(studentName);
System.out.println(contry);
}
}
运行结果:
Demo03_warning2.java:3: 错误: 找不到符号
System.out.println(studentName);
^
符号: 变量 studentName
位置: 类 Demo03_warning2
Demo03_warning2.java:4: 错误: 找不到符号
System.out.println(contry);
^
符号: 变量 contry
位置: 类 Demo03_warning2
2 个错误
试验3: 变量在相同的作用域下不能重名;(定义多个重名变量试试)
public class Demo03_warning3{
public static void main(String[] args){
//3, 测试定义重复的变量
int age = 10;
int age = 100;
System.out.println(age);
}
}
运行结果:
D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo03_warning3.java
Demo03_warning3.java:4: 错误: 已在方法 main(String[])中定义了变量 age
int age = 100;
^
1 个错误
试验4: 当前作用域无法使用其它作用域内的变量
public class Demo3_warning4{
public static void main(String[] args){
// 4,在不同的作用域中,变量不能互相使用
{
//Block1中定义一个变量
String strInBlock1 = "hello java";
}
{
//Block2中是否可以使用
System.out.println(strInBlock1);
}
}
}
运行结果:
D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo03_warning4.java
Demo03_warning4.java:10: 错误: 找不到符号
System.out.println(strInBlock1);
^
符号: 变量 strInBlock1
位置: 类 Demo03_warning4
1 个错误
试验5: 变量可以同时定义,但是初始化赋值只能单独的
public class Demo03_warning5{
public static void main(String[] args){
//方式1: 一行定义并初始化多个变量
int x2=10,y2=20,z2=30;
//方式2: 定义和初始化分开
//1,定义多个变量一行定义多个变量
int x1,y1,z1;
//2,分别初始化多个变量
x1=10;y1=20;z1=30; //写在一行和不写在一行没区别, 有分号就相当于分在三行.
//错误的写法: 但是不能如下这样
int x3,y3,z3 = 10,20,30;
}
}
运行结果
D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo03_warning5.java
Demo03_warning5.java:14: 错误: 需要<标识符>
int x3,y3,z3 = 10,20,30;
^
1 个错误
第二节 Java数据类型
2.1 概述
有没有想过一个问题: 程序在内存中运行的时候, CPU处理的所有数据都统一成一种类型不可以吗? 为什么要给数据划分类型? 为什么还要划分成基本的, 复杂的多种类型呢?
答案: 如果几百个G的数据到加载到内存中, 还有可能实现, 几百个TB或者几百个PB的数据呢? 所以, 内存永远是不够大的, 针对不同的数据分配不同大小的内存空间, 实际是为了节省内存空间. 这个不同大小的空间体现在你写程序的时候, 就是不同的数据类型.
2.2 变量种类
-
基本数据类型: (四类,八种)
-
- 整形 byte(1), short(2), int(4), long(8) 默认类型int类型
- 浮点型 float(4), double(8) 默认类型double类型
- 字符型 char(2)
- 布尔型 boolean(1)
复杂数据类型, 引用数据类型:
-
- 类
-
- 数组,字符串
-
- 接口
操作: 练习定义并使用各种类型的变量
2.3 注意事项
1, 整形数据类型默认为int类型
2, 浮点型的数据类型默认为double类型
在定义long型的时候,想要表示long型,那么值后面加一个字母l或者L
在定义float型的时候,为了表示float型,那么值后面加一个字母f或者F
第三节 Java数据类型转换
3.1 概述
为什么要进行数据类型的转换?
直观来看, 进行一个赋值操作 int num = 3.14;
发现赋值运算符=两边的数据类型的不统一的. 一个是int另外一个是float.计算机要如何操作呢, 罢工吗?
遇到两边取值范围(本质上是两种类型的数据占用内存空间不一样大), Java定义了两种类型转换的方式.
3.2 类型转换的种类
-
自动类型转换
也被称作隐式类型转换, 由Java自动完成, 条件是赋值运算符的左边为大范围类型, 右边是小范围类型
语法格式: 大类型 变量名 = 小类型;
// java会自动将10这个int常量转换为long类型赋值给amount变量 long amount = 10; //左边是long类型, 右边是int类型 //long amount = 10L; //常量使用L结尾标识后, 这样才是两边数据类型一致 // java会自动将100这个int常量转换为float类型赋值给number变量 float number = 100; //左边是float类型, 右边是int类型 //float number = 100F; //常量使用F结尾标识后, 代表这是一个float型常量, 两边数据类型一致
-
强制类型转换
上面是将小数据范围的数赋值给大数据范围的变量, 没有什么数值损失, 反之呢?这就需要我们程序员强制转换了, java不会自动承担这个类型转换带来的后果. 于是强制转换需要我们程序员明确操作.
语法格式: 小数据类型 变量名 = (小数据范围类型) 大数据类型范围的数据
首先测试, 程序员不采取任何操作什么现象
public class Demo04_dataType2{ public static void main(String[] args){ //大范围的float类型常量3.14,赋值给小范围的变量number int number = 3.14F; } }
运行结果:
不兼容的类型: 从float转换到int可能会有损失
这就是前面说的, java不给你承担损失, 抛出错误.D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo04_dataType2.java Demo04_dataType2.java:4: 错误: 不兼容的类型: 从float转换到int可能会有损失 int number = 3.14F; ^ 1 个错误
正确的方式
public class Demo04_dataType2{ public static void main(String[] args){ //大范围的float类型常量3.14,赋值给小范围的变量number int number = (int)3.14F; System.out.println(number); } }
运行结果
D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo04_dataType2.java D:\OnlineEdu\Task02 数据类型 运算符\code>java Demo04_dataType2 3
结果解析: 经过强制类型转换, java会确定程序员对精度损失的结果是有考虑的.
3.3 注意事项
1, 一般不要轻易使用强制类型转换(除非避免不了),因为会出现精度损失,数据溢出.
2, 特别注意: byte,short,char参加算术运算, 但是在没有超范围的情况下,会首先被提升为int
byte num1 = 10;
byte num2 = 20;
byte sum = num1+num2
这里第三行会出现问题: 首先num1+num2的时候会自动提升为int类型
char a = 'A'
当char类型参加运算的时候,会去ASCII
码表中,寻找char类型数据对应的整数
字符码表是什么?
ASCII
码表 美国人整的,每个字符都对应了一个整数,128个字符表示
UNICODE码表
:万国码表,包含了所有国家的字符注意: char数据类型在运算时候会被自动转换为int,再去参加运算
第四节 运算符
4.1 种类
算术运算符、赋值运算符、比较运算符、逻辑运算符、三目运算符
4.2 算术运算符
种类 | 符号 | 举例 |
---|---|---|
加 | + | 1+1, num1+num2 (除去加法这种算术运算, 还用来做字符串拼接) |
减 | - | 2-1, num1- num2 |
乘 | * | 10 * 10, num1 * num2 |
除 | / | 101 / 10, num1 / num2 (作用保留整数部分, 除数不能为0) |
求余取模 | % | 101 % 10 , num1 % num2 (作用求余数) |
自加 | ++i | 变量++i ( 作用先自加1, 再参与运算 ) |
自减 | --i | 变量 --i ( 作用先自减1, 再参与运算 ) |
自加 | i++ | 变量 i++ ( 作用先参与其它运算, 后自加1 ) |
自减 | i-- | 变量 i-- ( 作用先参与其它运算, 后自减1 ) |
注意:
1, 自加自减
2, 字符串与其它数据类型的拼接运算
4.3 赋值运算符
分类: 1, 基本赋值; 2, 复合赋值.
种类 | 符号 | 举例 |
---|---|---|
基本赋值 | = | num = 100; |
加赋值 | += | num += 1; 等价于 num = num +1; |
减赋值 | -= | num -= 10; 等价于 num = num -10; |
乘赋值 | *= | num *= 5; 等价于 num = num * 5 |
除赋值 | /= | num /= 10; 等价于 num = num /10; |
模赋值 | %= | num %= 10; 等价于 num = num %10; |
注意:
byte,short,char在参与运算的时候,会被提升为int类型
byte num1 = 125;
byte num2 = 125;
byte result = 0;
result = num1+num2;
System.out.println(result);
倒数第二行就会出现错误: 不兼容的类型: 从int转换到byte可能会有损失
但是在复合赋值中:byte,short,char在参与运算的时候,不用程序员手动强制类型转换
4.4 比较运算符
作用: 如果比较的结果为真, 返回true; 反之结果返回false.
种类 | 符号 | 举例 |
---|---|---|
相等比较 | == | |
大于比较 | > | |
小于比较 | < | |
大于等于比较 | >= | |
小于等于比较 | <= | |
不等比较 | != |
4.5 逻辑运算符
种类 | 符号 | 举例 |
---|---|---|
短路与 | && | i>0 && i<100 作用: 如果与判断左边为false, 右边不做判断 |
短路或 | || | gender=="男" || age<35 作用: 如果与判断左边为true, 右边不做判断 |
非 | ! | ! true, !(name==null) 作用: !true=false; !false = true |
与 | & | i>0 & i<100 作用: 无论左边是true还是false, 都计算右边 |
或 | | | gender=="男"| age<35 作用: 无论左边是true还是false, 都计算右边 |
4.6 三目运算符
语法: 布尔表达式?表达式1:表达式2
流程:
计算布尔表达式的逻辑值
如果是true,执行表达式1;
如果是false,执行表达式2
例子: 判断分数是否及格?
int score = 100;
String result = score>=60 ? "及格" : "不及格";
System.out.println(result);