📜个人简介 |
⭐️个人主页:摸鱼の文酱博客主页🙋♂️
🍑博客领域:java编程基础,mysql
🍅写作风格:干货,干货,还是tmd的干货
🌸精选专栏:【Java】【mysql】 【算法刷题笔记】
🎯博主的码云gitee,平常博主写的程序代码都在里面。
🚀支持博主:点赞👍、收藏⭐、留言💬
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
这里写目录标题
前言
文章中的位运算符一节涉及到了原码、反码和补码的知识,如果还有对这些不太明白的小伙伴,建议大家去看这篇:原码、反码和补码及其运算
一.变量
1.什么是变量
变量指的是程序运行时可变的量. 相当于开辟一块内存空间来保存一些数据。
Java中每个变量必须先声明,再赋值,然后才能使用。
Java 中的变量有四个基本属性:变量名,数据类型,存储单元和变量值
- 变量名:合法的标识符,具体请看: 变量名的命名规则
- 变量的数据类型:可以是基本类型和引用类型(必须包含类型)
- 存储单元:存储单元大小是由数据类型决定的,如:int 为4 个字节32 位
- 变量值:在存储单元中放的就是变量值(如果是基本类型放的就是具体值,如果是引用类型放的是内存地址,如果null,表示不指向任何对象)
注意事项:
l 定义变量的格式:数据类型 变量名 = 初始化值
lI 变量是通过使用变量名来访问这块区域的
2. 变量的分类
3.变量的作用域
也就是该变量能生效的范围, java中一般是变量定义所在的代码块,c语言中一般是在变量定义的那个函数中。
分类:(1)形参(方法签名中定义的变量):作用域在整个方法内;当类或对象调用某个方法时,系统会在该方法栈区为所有形参分配内存空间,并将实参的值赋给对应形参,这样就完成了形参的初始化;
(2) 方法局部变量(在方法内定义):作用域从定义该局部变量的地方开始生效,到该方法结束时消失;
(3)代码块局部变量(在代码块内定义):作用域从定义该变量的地方开始生效,到该代码块结束时失效;
4.常量
程序在执行过程中其值是不可以改变的量叫做常量。
Java中的常量: Java中常量是分两种的一种是字面值常量一种是面向对象常量,这篇文章只介绍字面值常量。
1).字符串常量 :双引号内包括的内容,特点是双引号内。
"abc" // String 字面值常量, 双引号中可以有多个字符.
2).整数常量 : 所有整数
10 // int 字面值常量(十进制)
010 // int 字面值常量(八进制) 由数字 0 开头. 010 也就是十进制的 8
0x10 // int 字面值常量(十六进制) 由数字 0x 开头. 0x10 也就是十进制的 16
10L // long 字面值常量. 也可以写作 10l (小写的L)
3).小数常量 :所有小数
1.0 // double 字面值常量. 也可以写作 1.0d 或者 1.0D
1.5e2 // double 字面值常量. 科学计数法表示. 相当于 1.5 * 10^2
1.0f // float 字面值常量, 也可以写作 1.0F
4).布尔常量 :其值比较特殊,只有两个值一个是true(正确的),一个是false(错误的),千万注意不能写错单词。
5).空常量 :null
6).字符常量 :单引号内包括的内容,只能是单个数字,单个字母或者单个字符。
'a' // char 字面值常量, 单引号中只能有一个字符
※ 在这里提一下,java关键字中有一个final:final 具有“不可改变的”的含义,可以修饰 非抽象类、非抽象成员方法和变量。
用 final 修饰的变量表示常量,只能被赋一次值(声明变量的时候)。
二.数据类型
java中数据类型分为基本数据类型和引用数据类型,这篇博客主要介绍八种基本数据类型的使用和注意事项(数据范围和运算方法等)
数值型
整数类型
1.整型–int
语法格式:
int 变量名 = 初始值;
其中,要注意变量名的设置(参考:变量名的命名规则)。
代码实例:
public static void main(String[] args) {
int a = 1;
System.out.println(a);
}
注意事项:
1. int 表示变量的类型是一个整型
2. 变量名是变量的标识. 后续都是通过这个名字来使用变量
3. Java 中 = 表示赋值(和数学不一样), 意思是给变量设置一个初始值.
4. 在 Java 中, 一个 int 变量占 4 个字节.
5. java是一门非常严谨的语言,对整型的大小有着明确规定,赋值时不可越界
使用以下代码查看 Java 中的整型数据范围:
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE); // int 的最大值
System.out.println(Integer.MIN_VALUE); // int 的最小值
}
如果运算的结果超出了 int 的最大范围, 就会出现溢出的情况
public static void main(String[] args) {
int maxValue = Integer.MAX_VALUE;
System.out.println(maxValue+1);
int minValue = Integer.MIN_VALUE;
System.out.println(minValue-1);
}
2.长整型–long
语法格式:
long 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
long num = 10L; // 定义一个长整型变量, 初始值写作 10l 也可以(小写的 L, 不是数字1).
System.out.println(num) ;
}
注意事项:
1. 基本语法格式和创建 int 变量基本一致, 只是把类型修改成 long
2. 初始化设定的值为 10L , 表示一个长整型的数字. 10l 也可以.
3. 使用 10 初始化也可以, 10 的类型是 int, 10L 的类型是 long, 使用 10 L 或者 10 l 更好一些.
4.java中没有longlong类型,和c语言区别
.
Java 中 long 类型占 8 个字节.
使用以下代码查看 Java 中的长整型数据范围:
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
}
3.短整型–short
语法格式:
short 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
short value = 0;
System.out.println(value);
}
注意事项:
1. short 占用 2 个字节, 表示的数据范围是 -32768 -> +32767
2. 这个表示范围比较小, 一般不推荐使用.
4.byte类型
byte,即字节,由8位的二进制组成。Java也提供了一个byte数据类型,并且是基本类型。
在计算机中,8位带符号二进制数的取值范围是[-128, 127],
所以在Java中,byte类型的取值范围也是[-128, 127]。
取值范围分析
一直在想为什么不是 -128 到 128呢?今天分析了一下这个问题。
首先我们得明白一件事情,那就是位运算规则:
正数的最高位都是 0 ,正数的值就是二进制表示的值。
负数的最高位都是 1 ,负数的值是 取反后加一 然后加个负号得到得值。
浮点类型
1.单精度浮点型–float
语法格式:
float 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
float num = 1.0f; // 写作 1.0F 也可以
System.out.println(num);
}
2.双精度浮点型–double
语法格式:
double 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
double num = 1.0;
System.out.println(num);
}
※关于浮点型数据的除法运算
在 Java 中, int 除以 int 的值仍然是 int(会直接舍弃小数部分).
如果想得到 0.5, 需要使用 浮点 类型计算(一般习惯上都使用double类型)
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("1/2="+a / b);
double c=1.0;
System.out.println("1.0/2="+c / b);
float d= 2.0F;
System.out.println("1/2.0="+a/d);
}
只要除数和被除数中有一个是浮点型,得数就是浮点型。
字符型–char
在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一 个字符占用两个字节, 表示的
字符种类更多, 包括中文.
语法格式:
char 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
char ch1 = 'A';
char ch2 = 111;
char ch3 = 0x134;
char ch4 = '中';
System.out.println(ch1);
System.out.println(ch2);
System.out.println(ch3);
System.out.println(ch4);
System.out.println(ch2-ch1);
}
注意事项:
1.JAVA中,char占2字节,16位。可在存放汉字。
2.char赋值:可以是单个字符,也可以是整数(十进制、十六进制都可以,但是要注意范围:0~65535
)输出的字符对应ascll码表。
3.char类型可以进行加减运算
public static void main(String[] args) {
char m='a';
System.out.println(m);
m='a'+'b';
System.out.println("'a'+'b'="+m); //char类型相加,提升为int类型,输出对应的字符
// a和b分别对应的数值为97和98,相加等于195
int k='a'+'b';
System.out.println("'a'+'b'="+k); //a+b对应ascll相加没有超过int范围 直接输出195
m='a'+1;
System.out.println("'a'+1="+m); //提升为int,计算结果98对应的字符是b。
m='喜'+'欢';
System.out.println("'喜'+'欢'="+m);
int n = '喜'+'欢';
System.out.println("'喜'+'欢'="+n);
}
从以上可以看出:char类型可以转换为int类型进行运算,但是int类型不可以转换为char类型。
具体原因请看本文章:基本数据类型转换规则
布尔型–boolean
布尔类型通常被用在流程控制中,作为判断条件。
语法格式:
boolean 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
boolean value1 = true;
boolean value2 = false;
System.out.println(value1);
System.out.println(value2);
}
注意事项:
1.布尔类型是表示逻辑状态的类型。java语言通过关键字boolean来定义布尔类型变量。
2.只有true和false两个值,分别代表布尔逻辑中的“真”和“假”。
3.Java语言虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。 在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替。
但是,要注意boolea类型并不能和int类型的数据进行比较、赋值
三.基本数据类型转换规则
基本数据类型从小到大的顺序:
自动类型转换
也叫隐式类型转换:小类型到大类型的转换
不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型
public static void main(String[] args) {
byte a = 100; //byte 表示的数据范围是 -128 -> +127,100 在范围之内.
// 从byte类型可以隐式提升至int类型
int b = 100;
a=b; //从int类型转换到byte类型会有精度损失 所以报错
byte c = 128;// 128 已经超过byte范围
short s =1000;
short k=100000000;//超出short范围(-32768--32767)
}
整数直接量可以直接赋值给byte、short、char,但不能超取值范围。
强制类型转换
也叫显式类型转换:大类型到小类型的转换
大类型转换小类型,需在变量前添加要转换成的数据类型。
注意事项:
1.整型默认是int类型;小数类型默认是double;char可当成一种特殊的整型。
2.boolean类型不能转换成其他任何数据类型。
3.所有的byte型、short型和char的值在运算时将被提升到int型
4.如果运算时其中一个操作数是long型,计算结果就是long型(float、double同理),
结果要拿long类型变量接收,否则会造成精度损失。
四.运算符
Java运算符按功能可分为:算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和条件运算符。
算数运算符
算术运算符包括通常的加(+)、减(-)、乘(*)、除(/)、取模(%)。
需要注意的是:许多语言中的取模运算只能用于整数型,Java对此做了扩展,它允许对浮点数进行取模操作。例如,3%2 的结果是 1, 15.2%5 的结果是 0.2。取模操作还可以用于负数,结果的符号与第一个操作数的符号相同,例如,5%-3 的结果是 2,-5%3 的结果是-2。
此外,算术运算符还有自增“++”和自减“–”两种。这两种运算符有前缀形式和后缀形式,含义有所不同。例如,i++ 和 ++i 的执行顺序是不一样的,i++ 在 i 使用之后再 +1,++i 在 i 使用之前先 +1。i-- 和 --i 的情况于此类似。
public static void main(String[] args) {
int n=1;
System.out.println("n="+ n++);
System.out.println("n="+ n);
System.out.println("n="+ ++n);
}
注意:
1. 如果不取自增运算的表达式的返回值, 则前置自增和后置自增没有区别.
2. 如果取表达式的返回值, 则前置自增的返回值是自增之后的值, 后置自增的返回值是自增之前的值.
关系运算符
关系运算符用来比较两个值,包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)和不等于(!=)6种。
关系运算符都是二元运算符,也就是每个运算符都带有两个操作数,运算的结果是一个逻辑值(关系运算符的表达式返回值都是boolean型)。
Java允许“==”和“!=”两种运算符用于任何数据类型。
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
}
逻辑运算符
逻辑运算符包括 逻辑与(&&)、 逻辑或(||)和 逻辑非(!)。前两个是二元运算符,后一个是一元运算符。
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
if(a==b && a==c){ // &&两侧有一侧为假就为假(全真为真,一假全假)
System.out.println(1);
}
if(a==b || a==c){ // ||两侧有一侧为真就为真
System.out.println(2);
}
boolean d=false;
if(!d){ //! 操作数为 true, 结果为 false; 操作数为 false, 结果为 true(取反)
System.out.println(3);
}
}
Java对逻辑与和逻辑或提供“短路”功能,也就是在进行运算时,先计算运算符左侧的表达式的值,如果使用该值能得到整个表达式的值,则跳过运算符右侧表达式的计算,否则计算运算符右侧表达式,并得到整个表达式的值。
public static void main(String[] args) {
//我们都知道, 计算 10 / 0 会导致程序抛出异常.
//但是代码却能正常运行, 说明 10 / 0 并没有真正被求值.
System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
}
-
对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式.
-
对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式.
位运算符
位运算符用来对二进制位进行操作,包括按位取反(~)、按位与(&)、按位或(|)、异或(^)、右移(>>)、左移(<<)和无符号右移(>>>)。
位运算符只能对整数型和字符型数据进行操作。
1. 取反(~)
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0。
2. 按位与(&)
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1,结果才为“1,否则为0。
3. 按位或(|)
运算规则:0 | 0=0; 0 | 1=1; 1 | 0=1; 1 | 1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
4. 异或(^)
运算规则:0^0=0; 0^1=1; 1 ^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
异或(^)运算的骚操作:不创建第三个变量,交换两个变量的值;
5. 左移(<<)
运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
可以看到3>>1以后变成了6, 有些时候可以用左位移运算符代替乘2的操作
思考一下:如果任意一个十进制的数左位移32位,右边补位32个0,十进制岂不是都是0了?当然不是!!! 当int 类型的数据进行左移的时候,当左移的位数大于等于32位的时候,位数会先求余数,然后再进行左移,也就是说,如果真的左移32位 12345 << 32 的时候,会先进行位数求余数,即为 12345<<(32%32) 相当于 12345<< 0 ,所以12345<< 33 的值和12345<<1 是一样的,都是 24690。
6. 右移(>>)
运算规则:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位正数补0,负数补1。
右移后得到的值 和int 类型的数据除以2取整所得的值一样,所以有些时候也会被用来替代除2操作,但是 切记二者根本上是不同的不可混淆。
另外,对于超过32位的位移,和左移运算符一样,,会先进行位数求余数。
7. 无符号右移(>>>)
无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的。
(对于源码、反码、补码不熟悉的同学,这里就不再进行补充了讲解了。)
计算机里的负数都是用补码(正数不变,负数符号位不变,真值部分取反,然后+1)表示的。
赋值运算符
赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。
+= -= *= /= %=叫增量赋值运算符
public static void main(String[] args) {
int a = 10;
a += 1; // 等价于 a = a + 1
System.out.println(a);
}
条件运算符
条件运算符( ? : )也称为 “三元运算符”或“三目运算符”。
语法格式:布尔表达式 ? 表达式1 :表达式2。
当布尔表达式的值为 true 时, 整个表达式的值为表达式1 的值;
当布尔表达式的值为 false 时, 整个表达式的值为 表达式 2 的值.
public static void main(String[] args) {
// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);
}
※运算符的优先级
在对一个表达式进行计算时,如果表达式中含有多种运算符,则要安运算符的优先次序一次从高向低进行。运算符的优先次序如下:
以上就是我总结的数据类型和运算符的相关知识点,如果您觉得有帮助,请动动小手点赞、评论、收藏。如果发现问题,也可以i在评论区指出,我会第一时间改正。
关注我,让我们一起学习Java,共同进步!!!