javase知识点总结:初认java,数据类型与变量,运算符

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一.初识java

1. 初识Java的main方法

main方法示例

public class HelloWorld{ 
public static void main(String[] args){
System.out.println("Hello,world");
}
}

如上展示的就是最简单的一个Java程序,

通过上述代码,我们可以看到一个完整的Java程序的结构,Java程序的结构由如下三个部分组成:

1.源文件(扩展名为*.java):源文件带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个类。类的内容必须包含在花括号里面。

2.类:类中带有一个或多个方法。方法必须在类的内部声明。

3.方法:在方法的花括号中编写方法应该执行的语句。

总结一下:类存在于源文件里面;方法存在于类中;语句存在于方法中。

注意:在一个源文件中只能有一个public修饰的类,而且源文件名字必须与public修饰的类名字相同

2 运行Java程序

Java是一门半编译型、半解释型语言。先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节

码组成的平台无关、面向JVM的文件。最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够

理解的形式来运行。

注意:在运行Java程序前,必须先安装好JDK(Java Development Kit即Java开发工具包),JDK里面就包含了javac和

java工具,Java程序最终是在JVM(Java虚拟机)中运行的。

【面试题】JDK、JRE、JVM之间的关系?

JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译

器javac与自带的调试工具Jconsole、jstack等。

JRE(Java Runtime Environment):Java运行时环境,包含了JVM,Java基础类库。是使用Java语言编写程

序运行的所需环境。

JVM:Java虚拟机,运行Java代码

javase知识点总结:初认java,数据类型与变量,运算符_Java

3. 注释

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

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

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

文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可以被javadoc工具解析,生成一套以网页文件形式体现的程序说明文档

注意:

1. 多行注释不能嵌套使用

2. 不论是单行还是多行注释,都不参与编译,即编译之后生成的.class文件中不包含注释信息。

4. 标识符

在上述程序中,HelloWorld称为类名,main称为方法名,也可以将其称为标识符,即:在程序中由用户给类名、方法名或 者变量所取的名字

硬性规则

标识符中可以包含:字母、数字以及 下划线和 $ 符号等等。

注意:标识符不能以数字开头,也不能是关键字,且严格区分大小写

软性建议

类名:每个单词的首字母大写(大驼峰)

方法名:首字母小写,后面每个单词的首字母大写(小驼峰)

变量名:与方法名规则相同

javase知识点总结:初认java,数据类型与变量,运算符_Java_02

一个大型的工程,是由多名工程师协同开发的,如果每个人都按照自己的方式随意取名,比如:person、PERSON、Person、_person,将会使程序非常混乱。如果大家在取名时能够遵守一定的约束(即规范),那多人写除的代码仿佛一个人写的。

下面那些标识符是合法的?

A:class B:HelloWorld C:main D:123abc E:ARRAY_SIZE F: $name G: name:jim

答:BCEF(F合法但不建议)

5. 关键字

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

用在循环结构中

二. 数据类型与变量

1. 字面常量

System.Out.println("Hello World"); 语句,不论程序何时运行,输出的都是Hello World,其实"Hello World"就是字面常量。

常量即程序运行期间,固定不变的量称为常量

命名规范:单词用纯大写字母表示,多个字母用下划线隔开

int AGE = 10;

int CLASS_ID = 1;

比如:一个礼拜七天,一年12个月等。

其中:100、3.14、‘A’、true/false都是常量,将其称为字面常量。

字面常量的分类:

1. 字符串常量:由""括起来的,比如“12345”、“hello”、“你好”。

2. 整形常量:程序中直接写的数字(注意没有小数点),比如:100、1000

3. 浮点数常量:程序中直接写的小数,比如:3.14、0.49

4. 字符常量:由 单引号 括起来的当个字符,比如:‘A’、‘1’

5. 布尔常量:只有两种true和false

6. 空常量:null

注意:字符串、整形、浮点型、字符型以及布尔型,在Java中都称为数据类型。

2. 数据类型

在Java中数据类型主要分为两类:基本数据类型引用数据类型

基本数据类型有四类八种:

1. 四类:整型、浮点型、字符型以及布尔型

2. 八种:

javase知识点总结:初认java,数据类型与变量,运算符_Java_03

javase知识点总结:初认java,数据类型与变量,运算符_Java_04

注意:

不论是在16位系统还是32位系统,int都占用4个字节,long都占8个字节

整形和浮点型都是带有符号的

整型默认为int型,浮点型默认为double

字符串属于引用类型。

//const在java中属于保留字,也是关键字(没有具体含义)
//被final修饰的变量不可修改
final int c = 30;
// 常量无法修改
// c = 40;
System.out.println(c);

静态变量static 必须定义在类中,不能定义在任何方法中。


javase知识点总结:初认java,数据类型与变量,运算符_Java_05

什么是字节?

字节是计算机中表示空间大小的基本单位.

计算机使用二进制表示数据. 我们认为 8 个二进制位(bit) 为一个字节(Byte).

我们平时的计算机为 8GB 内存, 意思是 8G 个字节.

javase知识点总结:初认java,数据类型与变量,运算符_Java_06

javase知识点总结:初认java,数据类型与变量,运算符_Java_07

int d =10;
// 正数按位取反得到的是负数
// |d| = 10 -> 加符号位-10 -> -1 -> -11
System.out.println(~d);

int e = -10;
// 负数按位取反的得到的是正数
// |e| = 10 -> 加符号位 10 -> -1 -> 9
System.out.println(~e);


javase知识点总结:初认java,数据类型与变量,运算符_Java_08

a = Integer.MAX_VALUE;
System.out.println(a);
// 整型最小值 -2147483648
int b;
b = Integer.MIN_VALUE;
System.out.println(b);

// 溢出问题
System.out.println("1.超出整型的保存范围,编译只保留前32位");
// 最大值加1变成最小值
System.out.println(a+1);//-2147483648
// 最小值减一变成最大值
System.out.println(b-1);//2147483647
// 字面量数值超出整型的范围时,编译报错
// int c =40000000000;//默认是int型变量,超出范围报错

3. 变量

3.1 变量概念

在程序中,除了有始终不变的常量外,有些内容可能会经常改变,比如:人的年龄、身高、成绩分数、数学函数的

计算结果等,对于这些经常改变的内容,在Java程序中,称为变量而数据类型就是用来定义不同种类变量的

3.2 语法格式

定义变量的语法格式为:

比如:

数据类型 变量名 = 初始值;

int a = 10; // 定义整形变量a,a是变量名也称为标识符,该变量中放置的值为10
double d = 3.14;
char c = 'A';
boolean b = true;
System.Out.println(a);
System.Out.println(d);
System.Out.println(c);
System.Out.println(b);
a = 100; // a是变量,a中的值是可以修改的,注意:= 在java中表示赋值,即将100交给a,a中保存的值就是100
System.Out.println(a);
// 注意:在一行可以定义多个相同类型的变量
int a1 = 10, a2 = 20, a3 = 30;
System.Out.println(a1);
System.Out.println(a2);
System.Out.println(a3);

3.3 整型变量

3.3.1 整型变量

// 方式一:在定义时给出初始值
int a = 10;
System.Out.println(a);
// 方式二:在定义时没有给初始值,但使用前必须设置初值
int b;
b = 10;
System.Out.println(b);
// 使用方式二定义后,在使用前如果没有赋值,则编译期间会报错
int c;
System.Out.println(c);
c = 100;
// int型变量所能表示的范围:
System.Out.println(Integer.MIN_VALUE);
System.Out.println(Integer.MAX_VALUE);
// 注意:在定义int性变量时,所赋值不能超过int的范围
int d = 12345678901234; // 编译时报错,初值超过了int的范围

注意事项:

1. int不论在何种系统下都是4个字节

2. 推荐使用方式一定义,如果没有合适的初始值,可以设置为0

3. 在给变量设置初始值时,值不能超过int的表示范围,否则会导致溢出

4. 变量在使用之前必须要赋初值,否则编译报错

5. int的包装类型为 Integer


整型的最大最小值为一个常量,保存在int的包装类中(Integer),

Integer.MAX_VALUE最大值,Integer.MIN_VALUE最小值

其余数据类型同理。

数据是有范围的,当数据类型的变量保存不下某个数值时,就会发生溢出。此时需要更换数据类型。

3.3.2 长整型变量

2^63bit

当整型存放不下时,更换为长整型来保存。

//        声明一个长整型
long a = 10;
//直接写出来的整数是int型
// 声明一个长整型字面量,在整数后面加l或L(推荐)
long b =400000000000L;
System.out.println(b);
// 最大最小值包装在包装类Long中
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);

3.3.3 短整型变量

javase知识点总结:初认java,数据类型与变量,运算符_Java_09

short在任何系统下都占2个字节

short的表示范围为:-32768 ~ 32767

3.3.4 字节型变量

javase知识点总结:初认java,数据类型与变量,运算符_Java_10

注意事项:

1. byte在任何系统下都占1个字节

2. byte的范围是:-128 ~ 127

3. 字节的包装类型为Byte

3.4 浮点型变量

3.4.1 双精度浮点型

javase知识点总结:初认java,数据类型与变量,运算符_Java_11

javase知识点总结:初认java,数据类型与变量,运算符_Java_12

解决:使用JDK提供的BigDecimal类

BigDecimal b1 = BigDecimal.valueOf(1.1);
BigDecimal b2 = BigDecimal.valueOf(1.1);
System.out.println(b1.multiply(b2));
b1.add(b2);//加
b1.subtract(b2);//减
b1.multiply(b2);//乘
b1.divide(b2);//除

注意事项:

1. double在任何系统下都占8个字节

2. 浮点数与整数在内存中的存储方式不同,不能单纯使用 2的n次方 的形式来计算

3. double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。

3.4.2 单精度浮点型

javase知识点总结:初认java,数据类型与变量,运算符_Java_13

flfloat 类型在 Java 中占四个字节, 同样遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数 都优先考虑 double, 不太推荐使用 flfloat. flfloat的包装类型为Float。

3.5 字符型变量

//        采用Unicode编码,支持全球语言 全部两字节
char c3 = '哈';
System.out.println(c3);
//不推荐
// int 变量1 = 10;
// int 变量2 = 20;
// int 计算结果 = 变量1 + 变量2;
// System.out.println(计算结果);

javase知识点总结:初认java,数据类型与变量,运算符_Java_14

注意事项:

1. Java 中使用 单引号 + 单个字母 的形式表示字符字面值。

2. 计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此 一个字符占用两个字节, 表示的字符种类更多, 包括中文。

3.6 布尔型变量

表示真就是true,假就是false,不存在0和1的转换。

javase知识点总结:初认java,数据类型与变量,运算符_Java_15

Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,boolean占一个字节。

3.7 类型转换

Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验.

在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。

3.7.1 自动类型转换(隐式)

自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理

特点:数据范围小的转为数 据范围大的时会自动进行

//        隐式
// int a = 10;
// long b = 100;//int字面量->long
//// 赋值
// long c = a;//int变量->long

int a = 100;
long b = 10L;
b = a; // a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值
a = b; // 编译报错,long的范围比int范围大,会有数据丢失,不安全

// int a = 1;
// int b = 2;
// double c = a/b;//int/int=int c的取值等运算后得到的数值提升为double
// System.out.println(c);//0.0

int a = Integer.MAX_VALUE;
long b = a+1;//相当于将一个已经溢出的数赋值给long b
long c = a+1L;//小类型和大类型共同参与运算,先将小类型转换成大类型再运算。
System.out.println(b);//-2147483648 和上面同理
System.out.println(c);//2147483648

3.7.2 强制类型转换(显式)

强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。

特点:数据范围大的到数据范围小的。

int a = 10;
long b = 100L;
b = a; // int-->long,数据范围由小到大,隐式转换
a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败

float f = 3.14F;
double d = 5.12;
d = f; // float-->double,数据范围由小到大,隐式转换
f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败

a = d; // 报错,类型不兼容
a = (int)d; // int没有double表示的数据范围大,需要强转,小数点之后全部丢弃

byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换
byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显式转换,否则报错

boolean flag = true;
a = flag; // 编译失败:类型不兼容
flag = a; // 编译失败:类型不兼容

javase知识点总结:初认java,数据类型与变量,运算符_Java_16

注意事项:

1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型

2. 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失

3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查

4. 强制类型转换不一定能成功,不相干的类型不能互相转换

3.8 类型提升

不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。

1. int与long之间:int会被提升为long

int a = 10;
long b = 20;
int c = a + b; // 编译出错: a + b-->int + long--> long + long 赋值给int时会丢失数据
long d = a + b; // 编译成功:a + b-->int + long-->long + long 赋值给long

2. byte与byte的运算

byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 编译报错
Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte c = a + b;

结论: byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误.

由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte short

这种低于 4 个字节的类型, 会先提升成 int, 再参与计算。

正确的写法:

byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);

类型提升小结:

1. 不同类型的数据混合运算, 范围小的会提升成范围大的.

2. 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算。

4. 字符串类型

在Java中使用String类定义字符串类型,比如:

public static void main(String[] args) {
String s1 = "hello";
String s2 = " world";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1+s2); // s1+s2表示:将s1和s2进行拼接
}

在有些情况下,需要将字符串和整形数字之间进行转换:

1. int 转成 String

int num = 10;
// 方法1
String str1 = num + "";
// 方法2
String str2 = String.valueOf(num);

2. String 转成 int

String str = "100";
int num = Integer.parseInt(str);

三. 运算符

1.算术运算符

(1) 基本四则运算符:加减乘除模(+ - * / %)

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);
// Exception in thread "main" java.lang.ArithmeticException: / by zero
// System.out.println(10 / 0);

模运算相当于数学中除法的余数

做除法和取模时,右操作数不能为0(除数不能为0)

int / int 结果还是int类型,而且会向下取整

int a = 10;
int b = 20;
// 在数学中应该是0.5 但是在Java中输出结果为0 会向下取整,即小数点之后全部舍弃掉了
System.out.println(a / b);
// 如果要得到数学中的结果,可以使用如下方式
double c = a*1.0 / b;
System.out.println(c);

(2)增量运算符: += -= *= %=

该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。

int a = 1;

a += 2;//3
System.out.println(a);

a -= 1;//2
System.out.println(a);

a *= 3;//6
System.out.println(a);

a /= 3;//2
System.out.println(a);

a %=3;//2
System.out.println(a);

注意:只有变量才能使用该运算符,常量不能使用。

(3) 自增/自减运算符 ++ --

++是给变量的值+1,--是给变量的值-1

int a = 1;
// 后置++是先使用变量原来值,表示式结束时给变量+1,( 先取值再运算)
System.out.println(a++);//输出1
// 前置++是先给变量+1,然后使用变量中的值,( 先++再取值)
System.out.println(++a);//输出3
// --操作符给操作-1,与++含义类似

注意:

如果单独使用,++a 和 a++ 没有任何区别

如果混合使用,++a先+1,然后使用变量+1之后的值,a++ 先使用变量原来的值,表达式

结束时给变量+1

只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改

2. 关系运算符

关系运算符主要有六个: == != < > <= >= ,其计算结果是 true 或者 false 。

//        一行中定义多个变量
int a =10,b = 20;
// = 是数学赋值运算 ,== 是关系运算符判断a和b是否相等
System.out.println(a == b);//false
System.out.println(a != b);//true
System.out.println(a < b);//true
System.out.println(a > b);//false
System.out.println(a <= b); // true
System.out.println(a >= b); // false
// 不能连着写
// 正确: 3 < a && a < 5
// System.out.println(3 < a < 5);

3. 逻辑运算符 (重要)

逻辑运算符主要有三个: && ||

! ,运算结果都是 boolean类型。

(1) 逻辑与 &&

语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。

相当于现实生活中的且,比如:如果是学生,并且 带有学生证 才可以享受半票。

两个表达式都为真,结果才是真,只要有一个是假,结果就是假。

javase知识点总结:初认java,数据类型与变量,运算符_Java_17

(2)逻辑或 ||

语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果。 相当于现实生活中的或。

javase知识点总结:初认java,数据类型与变量,运算符_Java_18

(3)逻辑非 !

语法规则:! 表达式

真变假,假变真

javase知识点总结:初认java,数据类型与变量,运算符_Java_19

(4) 短路求值

&& 和 || 遵守短路求值的规则.

注意:

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

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

& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值.


int a = 10;
int b = 20;
// //true
// System.out.println(a == 10 && b == 20);
// //false
// System.out.println(a == 10 && b > 20);
// 连着判断一个条件,需要关系运算符和逻辑运算符搭配使用
// System.out.println(a >= 5 && a <= 15);

// 短路操作
// 表达式1直接返回了flase,表达式2不再判断(不执行表达式2)
System.out.println(a >= 20 && a / 0 == 0);
// true
System.out.println(a == 10 || b / 0 == 0);

// true
System.out.println(a != 10 || b == 20 );
// false
System.out.println(a != 10 || b != 20);

4. 位运算符

Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。

位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。

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

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

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

(3) 按位取反 ~: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0.

(4) 按位异或 ^: 如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.

int a = 10;//01010
int b = 20;//10100
// 与 或 非 异或 运算
System.out.println(a & b);//二进制的 00000
System.out.println(a | b);//二进制的 11110
System.out.println(a ^ b);//二进制的 11110
System.out.println(~a);//二进制的 10101

javase知识点总结:初认java,数据类型与变量,运算符_Java_20

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

注意:

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

5. 移位运算(了解)

移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。

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

注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数

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

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

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

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

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

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

6. 条件运算符

布尔表达式 ? 表达式2 :表达式3

布尔表达式 真 取表达式2,假 取表达式3

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

//        三目运算符
// 布尔表达式 ? 表达式2 :表达式3 真 取表达式2,假 取表达式3
int max = a > b ? a : b;
System.out.println(max);

// 当表达式2和表达式3类型不一致,会发生隐式的类型提升,提升为最大类型然后赋值
double c = true ? 1 : 2.0;
System.out.println(c);
//出错
// int ret =true ? 1 : 2.0;
// System.out.println(ret);

注意:

表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换

表达式不能单独存在,其产生的结果必须要被使用

7. 运算符的优先级

在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 + 和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。

具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可.

//        运算符优先级(优先运算加括号就好)
// 求a和b平均值
int d = a + ((b - a)>>1);
System.out.println(d);
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java