【Java】饭要一口一口吃,学Java先来了解清楚数据类型和运算符(三)

简介: 变量,指的是程序运行时可变的量. 相当于开辟一块内存空间来保存一些数据.类型,则是对变量的种类进行了划分, 不同的类型的变量具有不同的特性.

🍴🍴🍴小结

Java 类型汇总. 前面的内容重点介绍的是基本数据类型

dd2e8f4913064b23bc45b16c688655c7.png

隐式类型转换和类型提升, 是本节的难点.
但是一般更推荐在代码中避免不同类型混用的情况, 来规避类型转换和类型提升的问题.

🍺🍺运算符

🥢🍚算术运算符

  • 基本四则运算符 + - * / %

规则比较简单, 值得注意的是除法:

a)int / int结果还是 int, 小数需要使用 double 来计算.

int a = 1; 
int b = 2; 
System.out.println(a / b); 
// 结果为 0 

b) 0 不能作为除数

int a = 1; 
int b = 0; 
System.out.println(a / b) 
// 运行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero 
 at Test.main(Test.java:5) 

c) % 表示取余, 不仅仅可以对 int 求模, 也能对 double 来求模

System.out.println(11.5 % 2.0); 
// 运行结果
1.5
  • 增量赋值运算符 += -= *= /= %=
    这里需要注意一个点:符合运算符在使用时会自动强制类型转换
short a = 10; 
a += 1; // 因为1是整型,混在一起是不能赋值给一个short型的,a=a+1会报错
//a+=1等价于a = (int)(a + 1) 符合运算符可以自动强制转换
System.out.println(a); 
  • 自增/自减运算符 ++ –
    我们分析一下上面的代码,如果这是一段c语言的代码,那这个 j 最终的数值就是100了,但是在java里,java编译器每次遇到自增自减的语句时,就会开辟一块新的内存空间来保存,然后再将这个换成变量的值赋给左边的变量,就像下面的代码:

先来看一下j=j++;

temp = j;
j = j + 1;
j = temp;

我们再来看一下,如果换成 j = ++j;流程如下:

temp = j +1;
j = j + 1;
j = temp;
int a = 10; 
int b = ++a; 
System.out.println(b); 
int c = a++; 
System.out.println(c); 

结论:(Java里自增自减与C语言不同)

1. 如果不取自增运算的表达式的返回值, 则前置自增和后置自增没有区别.

2. 如果取表达式的返回值, 则前置自增的返回值是自增之后的值, 后置自增的返回值是自增之前的值.


差异:

Java代码

public class Test {
public static void main(String[] args) {
int a = 1;
a = a++;
System.out.println(a);//输出结果为1
  }
}

C语言代码

#include<stdio.h>
void main() {
int a = 1;
a = a++;
printf("%d",a);//输出结果为2
}

在Java中我们可样解释,后加加运算a先自身加一,然后再将没有运算的值赋给a,最终结果a=1。在c语言中是按照优先级来运算的,后加加优先级低,a先赋值给a自身,然后a再加加,最终结果a=2

🥢🍚关系运算符

关系运算符主要有六个:

== != < > <= >=

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); 

注意: 关系运算符的表达式返回值都是 boolean 类型(true/false).

🥢🍚逻辑运算符(敲重点)

逻辑运算符主要有三个:

&& || !

注意: 逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是 boolean .

  • 逻辑与 &&
    规则: 两个操作数都为 true, 结果为 true, 否则结果为 false.
int a = 10; 
int b = 20; 
int c = 30; 
System.out.println(a < b && b < c); 
  • 逻辑或 ||
    规则: 两个操作数都为 false, 结果为 false, 否则结果为 true
int a = 10; 
int b = 20; 
int c = 30; 
System.out.println(a < b || b < c); 
  • 逻辑非 !(只能作用到boolean类型的数据上)
    规则: 操作数为 true, 结果为 false; 操作数为 false, 结果为 true(这是个单目运算符, >只有一个操作数).
int a = 10; 
int b = 20; 
System.out.println(!a < b); 
  • 短路求值
    && 和 || 遵守短路求值的规则.
System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false 
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true 

我们都知道, 计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值.

结论:

1. 对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式

2. 对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式.

& 和 | (不推荐使用)

& 和 | 如果操作数为 boolean 的时候, 也表示逻辑运算. 但是和 && 以及 || 相比, 它们不支持短路求值

System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0); // 程序抛出异常

🥢🍚位运算符

Java 中对数据的操作的最小单位不是字节, 而是二进制位.

位运算符主要有四个:

& | ~ ^

位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.

按位与 &: 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.

int a = 10; 
int b = 20; 
System.out.println(a & b); 

进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 10100

8cd52cea2140413695c6c175f59b6f13.png

按位或 |: 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.

int a = 10; 
int b = 20; 
System.out.println(a | b);

运算方式和按位于类似.

注意: 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.


🥢🍚移位运算符(了解)

移位运算符有三个:

<< >> >>>

都是按照二进制位来运算.

左移 <<: 最左侧位不要了, 最右侧补 0.

int a = 0x10; 
System.out.printf("%x\n", a << 1); 
// 运行结果(注意, 是按十六进制打印的) 
20 

右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)

int a = 0x10; 
System.out.printf("%x\n", a >> 1); 
// 运行结果(注意, 是按十六进制打印的) 
8
int b = 0xffff0000; 
System.out.printf("%x\n", b >> 1); 
// 运行结果(注意, 是按十六进制打印的) 
ffff8000

无符号右移 >>>: 最右侧位不要了, 最左侧补 0.

int a = 0xffffffff; 
System.out.printf("%x\n", a >>> 1); 
// 运行结果(注意, 是按十六进制打印的) 
7fffffff


注意:

1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.

2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.

3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.

4. 移动负数位或者移位位数过大都没有意义.

🥢🍚条件运算符

条件运算符只有一个:

表达式1 ? 表达式2 : 表达式3

当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;

当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.

也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.

// 求两个整数的最大值
int a = 10; 
int b = 20; 
int max = a > b ? a : b;

🥢🍚运算符的优先级

先看一段代码

System.out.println(1 + 2 * 3); 
• 1

结果为 7, 说明先计算了 2*3 , 再计算 1+

另外一个例子

System.out.println(10 < 20 && 20 < 30); 

此时明显是先计算的 10 < 20 和 20 < 30, 再计算 &&. 否则 20 && 20 这样的操作是语法上有误的(&& 的操作数只能是boolean).

运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可.

🍴🍴🍴小结

1. % 操作在 Java 中也能针对 double 来计算.

2. 需要区分清楚 前置自增 和 后置自增 之间的区别.

3. 由于 Java 是强类型语言, 因此对于类型检查较严格, 因此像 && 之类的运算操作数必须是 boolean.

4. 要区分清楚 & 和 | 什么时候是表示按位运算, 什么时候表示逻辑运算.

整体来看, Java 的运算符的基本规则和 C 语言基本一致.


🍺🍺注释

注释是为了让代码更容易被读懂而附加的描述信息. 不参与编译运行, 但是却非常重要.时刻牢记! 代码写出来是为了给人看的, 更是为了给三个月后的你自己看的.

🥢🍚基本规则

Java中的注释主要分为以下三种

单行注释:// 注释内容(用的最多)

多行注释:/* 注释内容*/(不推荐)

文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可用来自动生成文档

🥢🍚注释规范

1. 内容准确: 注释内容要和代码一致, 匹配, 并在代码修改时及时更新.

2. 篇幅合理: 注释既不应该太精简, 也不应该长篇大论.

3. 使用中文: 一般中国公司都要求使用中文写注释, 外企另当别论.
4. 积极向上: 注释中不要包含负能量(例如 领导 SB 等)

🍺🍺关键字

关键字是 Java 中的一些具有特定含义的单词.

Java关键字是对Java编译器有特殊含义的字符串,是编译器和程序员的一个约定,程序员利用关键字来告诉编译器其声明的变量类型、类、方法特性等信息。Java语言共定义了如下所示的关键字。


关键字

abstract

表明类或者成员方法具有抽象属性

assert

断言,用来进行程序调试

boolean

基本数据类型之一,声明布尔类型的关键字

break

提前跳出一个块

byte

基本数据类型之一,字节类型

case

用在switch语句之中,表示其中的一个分支

catch

用在异常处理中,用来捕捉异常

char

基本数据类型之一,字符类型

class

声明一个类

const

保留关键字,没有具体含义

continue

回到一个块的开始处

default

默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现

do

用在do-while循环结构中

double

基本数据类型之一,双精度浮点数类型

else

用在条件语句中,表明当条件不成立时的分支

enum

枚举

extends

表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口

final

用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量

finally

用于处理异常情况,用来声明一个基本肯定会被执行到的语句块

float

基本数据类型之一,单精度浮点数类型

for

一种循环结构的引导词

goto

保留关键字,没有具体含义

if

条件语句的引导词

implements

表明一个类实现了给定的接口

import

表明要访问指定的类或包

instanceof

用来测试一个对象是否是指定类型的实例对象

int

基本数据类型之一,整数类型

interface

接口

long

基本数据类型之一,长整数类型

native

用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的

new

用来创建新实例对象

package

private

一种访问控制方式:私用模式

protected

一种访问控制方式:保护模式

public

一种访问控制方式:共用模式

return

从成员方法中返回数据

short

基本数据类型之一,短整数类型

static

表明具有静态属性

strictfp

用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范

super

表明当前对象的父类型的引用或者父类型的构造方法

switch

分支语句结构的引导词

synchronized

表明一段代码需要同步执行

this

指向当前实例对象的引用

throw

抛出一个异常

throws

声明在当前定义的成员方法中所有需要抛出的异常

transient

声明不用序列化的成员域

try

尝试一个可能抛出异常的程序块

void

声明当前成员方法没有返回值

volatile

表明两个或者多个变量必须同步地发生变化

while

用在循环结构中

另外, 定义的变量名不能和关键字冲突.


❤原创不易,如有错误,欢迎评论区留言指出,感激不尽❤

❤如果觉得内容不错,给个三连不过分吧~                       ❤

❤看到会回访~                                                                   ❤


相关文章
|
3月前
|
Java
当Java数据类型遇上“爱情”,会擦出怎样的火花?
当Java数据类型遇上“爱情”,会擦出怎样的火花?
54 1
|
2月前
|
Java
Java运算符
Java运算符
48 12
|
2月前
|
Java
java基础(8)数据类型的分类
Java数据类型分为基本数据类型(8种)和引用数据类型。基本类型包括byte, short, int, long, float, double, boolean, char。每种类型有固定占用空间大小,如int占用4字节。字符编码如ASCII和Unicode用于将文字转换为计算机可识别的二进制形式。
67 2
|
3月前
|
Java 程序员
Java数据类型:为什么程序员都爱它?
Java数据类型:为什么程序员都爱它?
50 1
|
14天前
|
算法 Java 测试技术
🌟Java 零基础 | 详解 单目运算符
【10月更文挑战第14天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
27 7
|
16天前
|
Java 测试技术 开发者
🌟Java 零基础 | 深入理解三目运算符
【10月更文挑战第13天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
12 3
|
14天前
|
存储 Java 关系型数据库
[Java]“不同族”基本数据类型间只能“强转”吗?
本文探讨了不同位二进制表示范围的计算方法,重点分析了Java中int和char类型之间的转换规则,以及float与int类型之间的转换特性。通过具体示例说明了显式和隐式转换的条件和限制。
30 0
[Java]“不同族”基本数据类型间只能“强转”吗?
|
16天前
|
Java 测试技术 开发者
🌟Java零基础-Lambda运算符详解 🌟
【10月更文挑战第12天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
19 1
|
2月前
|
存储 Java Windows
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java中的char类型可以存储一个中文字符,因为它占用两个字节。转义字符允许在代码中使用特殊字符,例如`\n`表示换行,`\t`表示制表符,`\\`表示反斜杠,`\'`表示单引号,`\"`表示双引号。可以使用`\u`后跟Unicode编码来表示特定的字符。
48 2
java基础(9)数据类型中的char类型以及涉及到的转义字符
|
29天前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
44 4