Java--数据类型和运算符

📜个人简介

⭐️个人主页:摸鱼の文酱博客主页🙋‍♂️
🍑博客领域: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
    }
  1. 对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式.

  2. 对于 ||, 如果左侧表达式值为 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,共同进步!!!

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值