一. 常量
-
定义
- 在程序执行过程中其值不可以发生改变
- 常量就是指我们生活中用的数值,字母等
- 常量无法被改变,一旦改变,其意义也随之被改变
-
分类
- 字面值常量(比如1、'a'、3.1415、'I love you')
- 自定义常量(通过final关键字进行定义)
-
字面值常量的分类
- 字符常量 : 用单引号括起来的内容 'a'
- 字符串常量 : 用双引号括起来的内容 "abc" "ufc"
- 整数常量 : 所有的整数 1 0 3
- 小数常量 : 所有的小数 1.2
- 布尔常量 : 比较特殊, 只有true 和 false
- 空常量 : null(数组部分会讲到)
字符常量不能为空,即单引号中必须存在值,即使是空格;但是字符串常量可以为空,可以这样理解,C语言中字符串是通过char str[]=""的形式进行定义的,字符串的结尾始终存在着一个'\0',即使字符串中没有任何内容。空常量是引用数据类型中经常用到的常量,一个类的域如果定义为其他类型的类对象,那么这个域的默认值就为null,null代表已经在内存中开辟出了这部分空间,只是没有内容而已。
-
演示
public class TestDemo { public static void main(String[] args) { //字符常量 System.out.println('a'); //字符串常量 System.out.println("你好"); //数值常量 System.out.println(10); //小数常量 System.out.println(10.1); //布尔型常量 System.out.println(true); //空常量 无法直接打印null 编译器认为是不合适的 String s = null; System.out.println(s); } }
二. 变量
-
定义
- 在程序执行的过程中,在某个范围内可以发生改变
- 也就是说,其值是可以被改变的,在不同时期,同一个变量可以代表不同的值
- 有了变量之后,我们使用起来就非常灵活
-
格式
- 数据类型 变量名 = 变量值
-
意义
- 用来不断的存放同一类型的数据,并可以反复使用
- 从这里我们可以理解,变量的类型是固定的,其值可以被改变
- 有了变量之后, 我们才能定义方法,才有了编程
-
演示
public class TestDemo { public static void main(String[] args) { //定义一个整数型变量i int i = 10; System.out.println(i); //更改变量i的值 i = 15; System.out.println(i); } }
-
测试题
- 交换两个变量的值
public class Swap{
public static void main(String[] args) {
int a = 1;
int b = 2;
int c;
c = a;//将a的值复制给c
a = b;//将b的值复制给a
b = c;//将c的值复制给b
}
}
三. 定义变量的注意事项
-
作用域
-
在java中一对{ }就是一个作用域
-
同一个作用域内不能使用相同的变量名
-
演示
public static void main(String[] args) { int a = 1; //出现错误,当下面有代码需要使用到变量a的时候, jvm不知道用哪一个 int a = 2; System.out.println(a); }
-
-
初始化值
-
局部变量在使用之前必须要先赋值
-
没有具体的值,使用起来是没有意义的
-
演示
public static void main(String[] args) { int a; //这里会报错, 如果没有值, 操作a是没有意义的 System.out.println(a); }
-
java这点和C语言是不一样的,C语言如果不初始化还是一样可以使用,只不过拿到的是一个“脏数据”,意思就是从内存中随便拿一个值,会造成存储异常,Java直接在编译阶段就阻止了这种事情的发生。
-
一条语句可以定义多个相同类型的变量,只需要声明一次数据类型
-
演示
public static void main(String[] args) { //只定义变量不赋值 int a,b,c; //定义变量并赋值 int d =5,f=5; }
-
Java中一个分号(;)就代表一条语句,和C与C++一样,和Python不一样,Python以缩进作为语句的结束。
-
测试题
-
下列代码是否成立
public static void main(String[] args) { { int a = 10; } int a = 5;//定义并初始化成功,因为上面的作用域已经结束了,之前的a已经消亡 }
-
下列代码是否成立
public static void main(String[] args) { double d = 1.0;//定义并初始化成功,小数的字面值常量默认为double System.out.println(d); }
-
下列代码是否成立
public static void main(String[] args) { double a = 1.0 , double b = 2.0;//不成立,因为在一条语句中声明了两次double类型,只需要声明一次。 }
-
四. 数据类型
-
定义
- 在我们编程语言中,可以基本分为程序代码和数据,程序代码主要就是为了操作数据而生的.所以,为了防止发生混乱,那么我们就有必要将代码和数据区分开来,便于计算机和程序员理解使用
- 我们知道数据是存储于内存,或者其他存储器上的.我们如果想要存储数据,那么就必须先要在内存中开辟一块空间.可是数据大小都不一样,虚拟机到底开辟多大的一片地方才够用呢?空间小了,数据放不下,空间大了,就会造成内存的浪费.所以,我们就规定了几种类型,来存放不同长度的数据
- java数据强类型语言,对于每一种数据都定义了明确的具体数据类型.以便于虚拟机分配不同大小的内存空间
-
java中数据类型的分类
-
基本数据类型
-
引用数据类型(面向对象部分讲解)
java数据类型关系
-
- 基本数据类型
- char 占两个字节 0~65535(没有负数)
- boolean 理论上是占八分之一个字节
-
注意事项
- java中整数型默认的是int ,浮点型默认的是double , double的精度比float要高,所以如果我们将double转成float可能会造成丢失精度的问题.所以我们在给float类型的变量赋值时,要用f标明数值的类型
-
演示
public static void main(String[] args) { //定义byte型变量b byte b = 4; System.out.println(b); //定义 short型变量 s short s = 10; System.out.println(s); //定义int型变量i int i = 10; System.out.println(i); //定义long型变量 l long l = 100; System.out.println(l); //定义 float型变量 f float f = 1.0f; System.out.println(f); //定义double型变量d double d = 2.0; System.out.println(d); //定义boolean型变量b boolean flg = true; System.out.println(flg); //定义char型变量ch char ch = 'a'; System.out.println(ch); }
五. 数据类型的转换
-
定义
- 数据类型的转换就是将一种数据类型转换为另外一种数据类型
- 不同的数据类型之间是无法进行运算的
-
隐式转换
-
所有隐式转换就是不需要程序员过多的干预, 编译器可以帮我自动做的事情
-
这种情况,只要在编译器确定万无一失的情况下才会放行,比如小的数据类型转成大的数据类型
-
示例
public static void main(String[] args) { //将byte型转成int型 byte b = 10; int a = 4; int c = a+b;//成立,编译器自动将byte类型的数据转换为int类型 System.out.println(c); }
-
-
强制转换
-
当转换时有风险存在,编译器不会帮我们做这些事情,就需要我们手动进行转换,这时我们称之为强制转换
-
强制转换存在风险, 一定要确保可行再转换,可能会丢失精度
-
格式
- (要转换的类型)原数据
-
演示
public static void main(String[] args) { int i = 1000; byte b ; //将int型转换成byte b = (byte)i; }
-
-
注意事项
-
当我们定义byte类型的变量并赋值的时候, 其实后面的数值是int的型, 也就是说其实是将大的类型转到小的类型上去, 但是这里编译器依然没有报错, 那是因为编译器在编译的时候会尝试将判定数值的大小,如果数值没有超过变量类型的限定, 就可以存放。但是其他类型的复制就没有,比如如果将一个long类型的字面值常量赋值给一个int型的变量就无法成功。
-
演示
public static void main(String[] args) { byte b = 10;//数值10是int型的 没有超过byte的范围 //这里会报错 byte by = 128;//数值128是int型的, 超过了byte的范围 }
-
byte、short、char类型的变量在进行运算的时候会自动转换为int型然后进行运算,所以返回的数据是int型。
-
-
测试题
-
判断下列代码是否成立
public static void main(String[] args) { int i = 100L+100;//不成立,因为是long类型的字面值常量,转换为int型可能会丢失精度 }
-
六. char数据类型
-
编码表
- 计算机语言将我们平时用到的字符都存放到一个表中,对应着数字
-
char是否可以存储一个中文?
- 可以, 因为java使用的是Unicode编码,Unicode编码中的每个字符占用两个字节,中文也是两个字节
七. 算术运算符
-
定义
- 就是对常量和变量进行操作的符号
-
分类
- + :在java种有三种作用,正数,加法运算,字符串连接
- - :表示数值相减
- * :表示数值相乘
- / :表示数值相除
- % :表示取余数 结果的正负由左边的数值决定
- ++ :自增 对原来的数据进行+1
- -- :自减 对原来的数据进行-1
-
演示
public static void main(String[] args) { int a = 1; int b = 2; //加 System.out.println(a+b); //减 System.out.println(a-b); //乘 System.out.println(a*b); //除 System.out.println(a/b); //摩以 System.out.println(a%2); //自增 System.out.println(a++); //自减 System.out.println(a--); }
-
注意事项
- ++i表示先运算i自身,然后再赋值, i++表示先赋值, 再运算自身
- 在运算中, 我们必须将i++或者++i当作是一个整体来看,切莫和i本身混为一谈
- 很多书籍和视频中都对i++和++i做了详细的描述, 说道i++执行四步,++i执行三步. 但是在java中没有这样的说法, 基本看不出效果. 编译器自身肯定会做优化的
- 自增自减运算符和其他类型的运算符一样,也会返回值,但是副作用是对操作数本身会进行自增自减运算。自增自减运算符是先对操作数本身进行自增自减运算然后返回值。
-
测试题
-
求 a, b, c最后的值
public static void main(String[] args) { int a = 10; int b = 10; int c = 10; a = b++; a = 10 b = 11; c = --a; c = 9 a = 9; b = a--; b = 9; a = 8; System.out.println(a); System.out.println(b); System.out.println(c); }
-
预测结果
public static void main(String[] args) { int a = 1; a = a++; // a = 1,因为先自增后返回值 System.out.println(a); int b = a++ * ++a; System.out.println(b); }
-
八. 赋值运算符
-
定义
- 将数值传递给一个变量
-
分类
- = : 将值传递给左边
- += : 将左右两遍的值相加,结果再传递给左边
- -= : 将左右两遍的值想减,结果再传递给左边
- *= : 将左右两遍的值想乘,结果再传递给左边
- /= : 将左右两遍的值想除,结果再传递给左边
- %= : 将左右两遍的值想摩,结果再传递给左边
-
演示
public static void main(String[] args) { int a = 10; System.out.println(a); //加等于 a += 5; System.out.println(a); //减等于 a-=6; System.out.println(a); //乘等于 a*=10; System.out.println(a); //除等于 a/=5; System.out.println(a); //摩等于 a%=2; System.out.println(a); }
-
测试题
-
判断以下程序是否成立
public static void main(String[] args) { int a ; a += 10; //不成立,因为a尚未初始化 System.out.println(a); }
-
九. 关系运算符
-
定义
- 一般我们也称之为判断运算符, 就是用来判断运算符两边的值的关系,结果只能是boolean
-
分类
- == : 判断两边是否相等
- != : 判断两遍是否不相等
- > : 判断左边是否大于右边
- >= : 判断左边是否大于等于右边
- < : 判断左边是否小于右边
- <= : 判断左边是否小于等于右边
- instanceof : 判断两边的类型是否相等
-
演示
public static void main(String[] args) { System.out.println(1==1); System.out.println(1!=1); System.out.println(1>1); System.out.println(1>=1); System.out.println(1<1); System.out.println(1<=1); }
-
测试题
-
预测结果
public static void main(String[] args) { int a = 10; int b = 20; boolean flg = a+b > a; //这个公式一定成立吗? System.out.println(flg); }
-
十. 逻辑运算符
-
定义
- 逻辑运算符关联两个boolean结果, 结果还是一个boolean值
-
分类
- & : 同时 true & true = true true & false = flase
- | : 或 true| true = true true | false = true false | false = false
- ^ : 异或(相同为假不同为真) true ^ true = false false ^ false = false rue ^ false = true
- ! : 非 !true = false !false = true
- && : 同时, 短路与, 两遍只要有一边的值为fasle , 虚拟机就不会再查看另外一边了
- || : 或, 短路或, 两边只要有一遍的值为true, 虚拟机就不会再查看另外一边了
-
演示
public static void main(String[] args) { boolean b ; //& 同时 b = true&true; System.out.println(b); b = true&false; System.out.println(b); // | 或者 b = true | false; System.out.println(b); b = false | false; System.out.println(b); // ^ 异或, 相同为假 不同为真 b = true ^ true; System.out.println(b); b = true ^ false; System.out.println(b); // ! 非 非真即假,非假即真 b = !true; System.out.println(b); b = !false; System.out.println(b); // && 同时 如果前边是false, 后面就不再验证 b = false && true; System.out.println(b); // || 或者 如果前边是true ,后面就不再验证了 b = true || false; System.out.println(b); }
-
注释事项
- 短路与和短路或运算符前后是否都执行, 主要看第一个条件
总结:
- 常量
- 我们日常生活中的具体意义的符号
- 整数型常量 小数型常量 字符型常量 字符串常量 布尔型常量 空常量
- 变量
- 一块可以存储常量的空间, 这块空间是有大小限制的
- 数据类型 变量名;
- 使用变量的注意事项
- 重名问题 :
- 如果系统能区分两个名称可以使用
- 同一个域内, 能不能使用这个变量名, 主要看有没有其他变量正在使用这个名称
- 实际使用时,变量必须要有值
- 一条语句中可以定义多个相同类型的变量
- 定义变量时, 一个语句中,不能出现多个数据类型;
- 重名问题 :
- 数据类型
- 引用数据类型
- 数组 类 接口 枚举 注解
- 基本数据类型
- byte short int long float double char boolean
- 引用数据类型
- 数据类型转换
- 隐式转换 小的转成大的
- 强制转换 大的转成小, 虚拟机不会帮我们做, 我们需要手动强转
- char类型存储中文
- 计算机只能使用和存储二进制, 所以, Java中有内置的编码表, 表中是字符对应着一个数值
- 算术运算符
- 进行算术运算
- + - * / % ++ --
- 赋值运算符
- 将运算符右边的值赋给左边
- =
- 简写形式 : += -= *= /= %=
- 关系运算符
- 判断符号左右两边是否依据当前符号成立
- == != > >= < <=
- 逻辑运算符
- 连接两个boolean值, 综合得出一个新的结果, 结果还是一个boolean值
- & | ! && || ^
作业
-
第一题
- 哪一句话是错误的, 为什么?
public static void main(String[] args) { byte b1=3,b2=4,b; b=b1+b2; b=3+4; }
-
第二题
- 下面哪一话是错的, 为什么?
public static void main(String[] args) { byte b = 10; b++; b = b + 1;
-
第四题
- 判断flg的结果
public static void main(String[] args) { boolean flg = false | (true & (false^true)); }
-
扩展题
- 求出 j 的结果 , 写出运算步骤
public static void main(String[] args) { int i=3,j; j=(i++)+(i++)+(++i); System.out.println(j); }
-
扩展题
- 思考, java中域的域嵌套的情况下, 变量的重名问题? 哪些是可以使用相同变量名的,哪些是不能使用相同变量名的 ?
网友评论