写点什么

华为大佬万字长文总结,梳理的 Java 入门所有基础知识点,快收藏

发布于: 14 小时前
华为大佬万字长文总结,梳理的Java入门所有基础知识点,快收藏

今日分享开始啦,请大家多多指教~


一、 前言、入门程序、常量


1.1 Java 语言概述。


Java 是一种高级编程语言,而且是面向对象的编程语言。Java 语言是美国 Sun 公司(Stanford University Network),在 1995 年推出的高级的编程语言。Java 语言共同创始人之一:詹姆斯·高斯林 (James Gosling),被称为 Java 之父。Java 语言的版本:1.0-1.4,5.0…8.0…13.0,本文笔记用的是 jdk 版本为 8.0。


1.2 Java 语言能做什么


Java 语言主要应用在互联网程序的开发领域,网上购物商城、物流、金融、各行各业的门户网站。


1.3 Java 语言的跨平台实现原理


(1) JVM: Java 虚拟机,是专门用来运行 Java 程序的。


(2) 平台:指的就是操作系统,比如 Windows、linux、MacOS 等。


(3) 跨平台: 我们编写的一个 Java 程序,可以做多个操作系统上运行一次编译,到处运行。


(4) 问题思考,如下:


Java 程序是跨平台的? ⇒ 正确的 ⇒ 一次编译到处运行。


JVM 是跨平台的? ⇒ 错误的 ==> JVM 是实现 Java 程序跨平台的基石。针对不同的操作系统提供不同的 JVM。而程序在 JVM 中运行。


Java 程序的跨平台是依靠 JVM 的不跨平台实现的。正确的


1.4 JDK、JRE、JVM 的组成和作用


JVM: Java 虚拟机,是专门用来运行 Java 程序的,但是不能单独安装。


JRE: Java 运行环境,包含 JVM(Java 虚拟机,是专门用来运行 Java 程序的)和核心类库。


JDK: Java 开发工具包,包含 JRE 和开发工具。


三者关系: JDK > JRE > JVM


1.1 Java 语言开发环境搭建


JDK 安装,注意事项:


注意操作系统是 Windows、linux、MacOS


注意操作系统的位数是 32 位还是 64 位


安装 java 相关软件的时候: 安装路径中不允许出现中文和空格(任何开发软件都最好不要安装在中文路径下)


1.2 常用 DOS 命令的使用


如何进入 DOS 命令操作窗口?


1.开始/命令提示符


2.开始/搜索程序和文件 输入 cmd


3.Windows 键 + R --> 输入 cmd


4.窗口空白处/按住 shift 键 + 鼠标右键单击 /在此处开命令窗口


5.常用命令如下表所示:


1.3 环境变量 JAVA_HOME 的配置


记事本软件的启动方式?


1.开始/程序/附件/记事本


2.C:/windows/找到 notepad.exe 命令,双击启动


3.如果在 DOS 窗口的命令中:


C:\windows> notepad.exe 回车 运行这个命令


首先在 C:\windows 路径下,寻找是否存在 notepad.exe,发现有,直接运行


D:\abc> notepad.exe 回车 运行这个命令


首先:在 D:\abc 路径下,寻找是否存在 notepad.exe,发现没有


其次: 如果发现在当前路径 D:\abc 没有要运行的 notepad.exe 命令,到系统环境变量 path 中寻找


path:... C:\Windows;...,发现 path 中配置的路径 C:\Windows 有该命令,直接运行.


如果 path 中配置的所有的路径中都没有要运行的命令,运行报错了.


给 Java 配置环境变量的意义/目的/作用?


让我们可以在任意路径下运行 java 开发的相关工具(javac: 编译工具,java: 运行工具)


比如 jdk 的安装路径:C:\develop\Java\jdk1.8.0_162


配置步骤:


1.创建名称为 JAVA_HOME 的环境变量,取值是 C:\develop\Java\jdk1.8.0_162


2.把步骤 1 中创建的名称为 JAVA_HOME 的环境变量,添加到系统环境变量 path 中


找到系统环境变量 path, 在前面添加: %JAVA_HOME%\bin;...


3.如果在 DOS 窗口的命令中:


C:\develop\Java\jdk1.8.0_162\bin> javac.exe 回车 运行这个命令


首先在 C:\develop\Java\jdk1.8.0_162\bin 路径下,寻找是否存在 javac.exe,发现有,


直接运行


D:\abc> javac.exe 回车 运行这个命令 首先:在 D:\abc 路径下,寻找是否存在 javac.exe,发现没有


其次: 如果发现在当前路径 D:\abc 没有要运行的 javac.exe 命令,到系统环境变量 path 中寻找


path:... %JAVA_HOME%\bin;..., 发现 path 中配置的名称为 JAVA_HOME 的环境变量,对应的路径


C:\develop\Java\jdk1.8.0_162\bin 中有要运行的 javac.exe 命令,直接运行,


如果 path 中配置的所有路径中,都没有要运行的 javac.exe 命令,运行报错了


寻找名称为 JAVA_HOME 的环境变量,找到后,使用其配置的具体路径进行替换:


path:... C:\develop\Java\jdk1.8.0_162\bin;...,


替换后的路径: C:\develop\Java\jdk1.8.0_162\bin 中有 javac 命令,就可以直接运行


二、HelloWorld 入门程序


2.1 程序开发的步骤


  1. 源程序:


程序员写的程序;


程序员在自己可以看得懂得程序;


程序:字母、数字、其他符号;


源程序是程序员编写的,程序员自己可以看得懂得程序,本质就是一个文本文件,但是扩展名不是 .txt,而是 .java。


  1. 生产 JVM 可以执行的字节码(.class)文件


JVM:叫做 Java 虚拟机,是专门用来运行 Java 程序的。但是 JVM 是一个二货,只能识别 0 和 1,而存储 0 和 1 的文件叫做 字节码文件(.class 文件)


如何把源文件(程序)翻译成 JVM 能够执行的字节码文件(程序)呢? 使用 javac 命令(编译命令), 使用格式:javac 文件名.java 例如:编译 HelloWorld.java 源文件: javac HelloWorld.java,生成一个字节码文件:HelloWorld.class


  1. 把字节码文件交给 JVM 执行


不管是源文件(程序)还是字节码文件(程序)都存储在硬盘中? 不会自动执行,如何把字节码文件交给 JVM 执行呢? 使用 java 命令(运行命令)。 使用格式: java 文件名 例子:java HelloWorld。


2.2 HelloWorld 案例的编写编译运行


  1. 编写源文件。 创建一个名称为 HelloWorld.txt 的文本文件,把扩展名修改为 .java,打开 HelloWorld.java 源文件,输入以下内容,并保存(ctrl+s)。

  2. 编译: javac 命令。 根据 .java 源文件 生产对应的 .class 文件(字节码文件)。 使用 javac 命令的格式:javac 文件名.java。javac HelloWorld.java。注意:


保证当前路径下 javac 命令 可以使用。


保证当前路径下有要进行编译的 源(.java)文件。


使用编译 javac 命令时,文件名后面必须写 扩展名.java。


3.运行: java 命令。 把 字节码(.class)文件 交给 jvm 执行。使用 java 命令的格式:java 文件名,java HelloWorld,同样要注意:


保证当前路径下 java 命令 可以使用。


保证当前路径下有要进行运行的 字节码(.class)文件。


使用运行 java 命令 时,文件名后面不能写 扩展名.class。


2.3 初学者编写 HelloWorld 常见问题


非法字符问题。Java 中的符号都是英文格式的。


大小写问题。Java 语言对 大小写敏感(区分大小写)。


在系统中显示文件的扩展名,避免出现 HelloWorld.java.txt 文件。


编译命令后的 java 文件名需要带文件后缀 .java。


运行命令后的 class 文件名(类名) 不带文件 后缀.class。


不要把 main 写成 mian。


2.4 Notepad++ 软件的安装和配置


三、注释和关键字


3.1 注释


概念: 在代码中添加注释可提高代码的可读性。注释中包含了程序的信息,可以帮助程序员更好地阅读和理解程序。在 Java 源程序文件 的任意位置都可以添加注释,且 Java 编译器不编译代码中的注释,也就是说代码中的注释对程序不产生任何影响。所以开发者不仅可以在注释中编写代码的说明文字、设计者的个人信息,还可以使用注释来屏蔽某些不希望执行的代码。


分类: Java 提供了 3 种代码注释,分别为单行注释、多行注释和文档注释。


1、单行注释:// 为单行注释标记,从符号 // 开始直到换行为止的所有内容均作为注释而被编译器忽略。语法格式如下:


// 注释内容


int age ; // 声明 int 型变量,用于保存年龄信息


2、多行注释: /* / 为多行注释标记,符号 / 与 */ 之间的所有内容均为注释内容。注释中的内容可以换行。语法格式如下:


3、文档注释: /…*/ 为文档注释标记。符号 / 与 */ 之间的内容均为文档注释内容。当文档注释出现在声明(如类的声明、类的成员变量声明、类的成员方法声明等)之前时,会被 Javadoc 文档工具 读取作为 Javadoc 文档内容。文档注释的格式与多行注释的格式相同。对于初学者而言,文档注释并不是很重要,了解即可。示例如下:


说明:一定要养成良好的编码习惯。软件编码规范中提到 可读性第一,效率第二,所以程序员必须要在程序中添加适量的注释来提高程序的可读性和可维护性。建议程序中的注释总量要占程序代码总量的 20%~50%。


3.2 关键字


引入:邮箱: @前面是用户名,@后面是使用的是哪家的邮箱。


换而言之,关键字是 Java 中已经被赋予特定意义的一些单词,不可以把这些字作为标识符来使用。关键字中的所有字母都是小写的,或者在高级编辑器中彩色显示。


Java 中的关键字如下表所示:


3.3 标识符


标识符可以简单地理解为一个名字,用来标识类名、变量名、方法名、数组名等的有效字符序列。Java 规定标识符由 任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字。标识符不能是 Java 中的保留关键字。 示例:


常见错误:用中文命名标识符是非常不好的编码习惯。当编译环境的字符编码集发生改变后,代码中所有的中文标识符全部会显示成乱码,程序将无法维护。因为 Java 是一种可以跨平台的开发语言,所以发生中文标识符显示成乱码这种情况的概率非常大。编写 Java 代码有一套公认的命名规范:


类名:通常使用名词,第一个单词字母必须大写,后续单词首字母大写。(大驼峰式)


方法名:通常使用动词,第一个单词首字母小写,后续单词首字母大写。(小驼峰式)


变量:第一个单词首字母小写,后续单词首字母大写。(小驼峰式)


常量:所有字母均大写。


单词的拼接:通常使用 userLastName 方式拼接单词,而不是 user_last_name。


四、常量与变量


4.1 常量的概念和分类


引入:


数学中的常数,对应到 java 中叫常量,数学中的常数有分类,java 中的常量也有分类,而且比数学中的分类更加丰富。


1、概念: 在程序的执行过程中,其值不可以发生改变的量。


2、分类:


整数常量:1314、520


小数常量:13.14、5.20


字符常量:java 中规定字符常量必须使用单引号 '' 引起来,而且单引号 '' 中只能写一个字符(不能不写,也不能写 2 个以上) 举例:


布尔常量:只有两个值 true 和 false。true:表示肯定的,对的,是的,正确的,成立的。false:表示否定的,错的,不是的,却无的,不成立的。


字符串常量:java 中规定字符串常量必须使用双引号 "" 引起来,而且双引号 "" 中可以写多个字符(0 个、1 个、2 个…), 举例:


空常量:null


4.2 打印不同类型的常量


同 C 语言 一样,Java 程序想要在控制台输出文字,需要调用一个已有的方法,方法如下:


System.out.print("Hello!"); // 此方法输出"Hello"后不会自动换行,光标停留同一行的末尾


但与 C 语言 不同的是,Java 又提供了一个输出文字后自动换行的方法,这个方法在原有的 print 后面加上了 ln 后缀,方法如下:


System.out.println("Hello!"); // 此方法输出"Hello"后会自动换行,光标停留下一行的开头


打印不同类型的常量,示例如下:


4.3 变量和数据类型【重要】


引入:


1、变量概念: 在程序的执行过程中,其值可以在一定范围内发生改变的量。可以把变量理解成为一个 容器,例如一个空烧杯,给变量赋值就相当于给烧杯倒水。如下图所示的那样,变量可以不断更换值,就像烧杯可以反复使用一样:


2、分类:


3、变量定义格式图解分析:


变量的理解:


变量的本质就是内存中的一块空间,空间的大小由数据类型决定。


要想找到变量对应的内存空间的数据,需要给变量对应的内存空间起个名字,叫做变量名称。对于变量的命名并不是任意的。


应遵循以下几条规则:


a.变量名必须是一个有效的标识符。


b.变量名不可以使用 Java 中的关键字。


c.在同一个大括号范围内,变量名不能重复。


d.应选择有意义的单词作为变量名。


说明:在 Java 中允许使用汉字或其他语言文字作为变量名,如 int 年龄 = 21; 在程序运行时不会出现错误,但建议尽量不要使用


这些语言文字作为变量名。


变量对应的内存空间中必须有数据才能使用,这种向变量内存空间中,存储数据的过程叫做初始化或者赋值。


图解:


为什么要声明变量呢?简单地说,就是要告诉编译器这个变量属于哪一种数据类型,这样编译器才知道需要分配多少空间给它,以及它可以存放什么样的数据。


4、定义 8 种变量 1:


5、定义 8 种变量 2:


变量的注意事项:定义的变量,不赋值不能使用。定义 long 类型的变量时,需要在整数的后面加 L(大小写均可,建议大写)。同理,定义 float 类型的变量时,需要在小数的后面加 F(大小写均可,建议大写)。


4.4 数据类型转换


类型转换是将一个值从一种数据类型更改为另一种数据类型的过程。例如,可以将 String 类型数据 457 转换为一个数值型,而且可以将任意类型的数据转换为 String 类型。数据类型转换有两种方式,即 隐式转换与显式转换。 如果从低精度数据类型向高精度数据类型转换,则永远不会溢出,并且总是成功的;


而把高精度数据类型向低精度数据类型转换则必然会有信息丢失,甚至有可能失败。这种转换规则就像下图所示的两个场景,高精度相当于一个大水杯,低精度相当于一个小水杯,大水杯可以轻松装下小水杯中所有的水,但小水杯无法装下大水杯中所有的水,装不下的部分必然会溢出。


从低级类型向高级类型的转换,系统将自动执行,程序员无须进行任何操作。这种类型的转换称为 隐式转换,也可以称为自动转换。 下列基本数据类型会涉及数据转换(不包括逻辑类型),这些类型按精度从 “低”到“高” 排列的顺序为 byte < short < int < long < float < double,可对照下图,其中 char 类型比较特殊,它可以与部分 int 型数字兼容,且不会发生精度变化。


隐式转换具体分析如下:


Java 程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。


int + int


int + long ==> long + long (把 int 转换成 long: 从小到大,自动类型转换,不需要代码的干预)


int + long ==> int + int (把 long 转成 int: 从大到小,强制类型转换,必须手动代码完成)


总结:


1.隐式转换(自动类型转换)概念:


取值范围小的数据或者变量可以直接赋值给取值范围大的变量(小萝卜可以直接放入大坑中)


2.特点:


(1)自动类型转换是自动完成的,不需要代码的干预


(2)byte/short/char 类型数据,只要参加运算会自动转换为 int 类型


(3)byte、short、char-->int-->long-->float-->double


举例:有一个 byte 类型(1 个字节)的数字 5: 00000101


byte 类型自动类型转换成 short 类型(2 个字节):在左侧补充 1 个字节的 0,因为左侧补充的都是 0,对原有数据是没有影响的,仍然是 5,


00000000 00000101


byte 类型自动类型转换成 int 类型(4 个字节):


在左侧补充 3 个字节的 0,因为左侧补充的都是 0,对原有数据是没有影响的,仍然是 5


00000000 00000000 00000000 00000101


byte 类型自动类型转换成 long 类型(8 个字节):


在左侧补充 7 个字节的 0,因为左侧补充的都是 0,对原有数据是没有影响的,仍然是 5


00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101


总结:根据需求,在数据前面补充若干字节的 0,因为补充的都是 0,对原有数据大小是没有影响的(打肿脸充胖子)


示例代码,如下:


显式转换具体分析如下:


当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换(又称强制类型转换),


当执行显式类型转换时可能会导致精度缺失。语法如下:


(类型名) 要转换的值


取值范围大的数据或者变量不能直接赋值给取值范围小的变量(大萝卜不能直接放入小坑中),解决方案:


(1) 把坑变大


(2) 把萝卜变小(强制类型转换)


2.格式:


转后类型 变量名称 = (转后类型) 转前数据或者变量;


long 类型(8 个字节)的数字 5:


long num = 5L;


long 类型强制类型转换成 int 类型(4 个字节):


int a = (int)num;//把 num 中的数据强制类型转换成 int 类型,并把结果赋值给 int 变量 a


举例: 有一个 long 类型(8 个字节)的数字 5:


00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101


long 类型强制类型转换成 int 类型(4 个字节):


砍掉左侧的四个字节的内容,因为砍掉的都是数字 0,所以对最终的结果数据没有影响仍然是 5


00000000 00000000 00000000 00000101


long 类型强制类型转换成 short 类型(2 个字节):


砍掉左侧的六个字节的内容,因为砍掉的都是数字 0,所以对最终的结果数据没有影响仍然是 5


00000000 00000101


long 类型强制类型转换成 byte 类型(1 个字节):


砍掉左侧的七个字节的内容,因为砍掉的都是数字 0,所以对最终的结果数据没有影响仍然是 5


00000101


总结: 根据需求,砍掉数据左侧的若干字节的数据,只要砍掉的都是 0,对原数据没有影响


但是只要砍掉的数据中包含 1,就会对原数据产生影响(可能会损失精度)


示例代码 2,如下:


图解(其它案例):


4.5 ASCII 码表


计算机是一个二货,只能存储 0 和 1,所以存储到计算机中的所有内容都会转换成 0 和 1 进行存储。所以我们在计算机中存储的字符也不例外,也需要把字符转换成 0 和 1 进行存储,问题: 如何把字符转换成 0 和 1 呢? 通过 ASCII 编码表: 存储字符和数字对应关系的一张表格。 存储字符时:需要查找 ASCII 码表,找到字符对应的数字,将数字转换为二进制数存放到计算机中。


ASCII 码表如下图所示:


int 类型和 char 类型的运算原理,如下:


五、计算机中的进制与字节


计算机中的存储单位(2 的 10 次方就是 1024)


务必记住:1 个字节是 8 位


六、运算符


运算符:对常量或者变量进行操作的符号。表达式:用运算符把常量或者变量连接起来符合 java 语法的式子就可以称为表达式。


6.1 算术运算符


Java 中的算术运算符主要有 +(加号)、-(减号)、*(乘号)、/(除号)、%(求余),它们都是二元运算符。Java 中算术运算符的功能及使用方式如下表所示:


其中,“+”和“-” 运算符还可以作为数据的正负符号,如 +5、-7。说明:“+”运算符也有拼接字符串的功能。下面分别演示算术运算符的用法。


【示例 1】算术运算符加减乘除。示例代码如下:


6.2 赋值运算符


赋值运算符用符号 “=” 表示,它是一个二元运算符(对两个操作数作处理),其功能是将右方操作数所含的值赋给左方的操作数。例如:


int a = 100; // 该表达式是将 100 赋值给变量 a


/*左方的操作数必须是一个量,而右边的操作数则可以是变量(如 a、number)、


常量(如 123、"book")、有效的表达式(如 4512)。/


和其他主流编程语言一样,Java 中也有复合赋值运算符。所谓的复合赋值运算符,就是将赋值运算符与其他运算符合并成一个运算符来使用,从而同时实现两种运算符的效果。Java 中的复合运算符如下表所示:


以“+=”为例,虽然“a += 1”与“a = a + 1”二者最后的计算结果是相同的,但是在不同场景下,两种运算符都有各自的优势和劣势。


【示例 2】赋值运算符的使用场景。示例代码如下:


6.3 自增自减运算符


自增、自减运算符是单目运算符,可以放在变量之前,也可以放在变量之后。自增、自减运算符的作用是使变量的值加 1 或减 1。


例如下图所示:


6.4 关系运算符


关系运算符属于二元运算符,用来判断一个操作数与另外一个操作数之间的关系。不管关系表达式多么复杂或者多么简单,返回值一定是布尔类型的结果,要么是 true,要么是 false,如下表所示:


【示例 3】关系运算符。示例代码如下:


6.5 逻辑运算符


假定某面包店,在每周二的下午 7 点至 8 点和每周六的下午 5 点至 6 点,对生日蛋糕商品进行折扣让利活动,那么想参加折扣活动的顾客,就要在时间上满足这样的条件,(周二并且 7:00 PM~8:00 PM)或者(周六并且 5:00 PM~6:00 PM),这里就用到了逻辑关系。逻辑运算符是对 true(真) 和 false(假) 这两种逻辑值进行运算,运算后的结果仍是一个逻辑值。


用来连接多个条件(布尔表达式的: 结果为 true/false 的式子),最终的结果也必须是一个布尔类型的数据,要么是 true,要么是 false


不管逻辑运算符连接的式子有多么简单或者多么复杂,最终结果要么是 true,要么是 false


分类:


(1) & (shift+7): 逻辑与,表示并且的意思,多个条件同时成立的意思,就是只有多个条件都是 true,最终的结果才是 true


特点:【有 false,则 false】: 只要有一个条件不成立(false),结果就是 false


(2) |(shift+): 逻辑或,表示或者的意思,多个条件,只要有一个成立,最终的结果就是 true


特点:【有 true,则 true】:只要有一个条件是 true,结果就是 true


(2) !(shift+1): 逻辑取反,!true 就是 false,!false 就是 true


逻辑运算符的短路效果,如下表所示:


逻辑运算符的运算结果如下表所示:


说明如下:


6.6 位运算符


位运算的操作数类型是整型,可以是有符号的,也可以是无符号的。位运算符可以分为位逻辑运算符和位移运算符两大类。


位逻辑运算符包括 &、|、^和 ~,前三个是双目运算符,第四个是单目运算符。这四个运算符的运算结果如下表所示:


参照上表来看一下这四个运算符的实际运算过程:


1)位逻辑与实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求与,


若两个操作数对象同一位都为 1,则结果对应位为 1,否则结果中对应位为 0。例如,12 和 8 经过位逻辑与运算后得到的结果是 8。


0000 0000 0000 1100 (十进制 12 原码表示)


& 0000 0000 0000 1000 (十进制 8 原码表示)


0000 0000 0000 1000 (十进制 8 原码表示)


2)位逻辑或实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求或,


若两个操作数对象同一位都为 0,则结果对应位为 0,否则结果中对应位为 1。例如,4 和 8 经过位逻辑或运算后的结果是 12。


0000 0000 0000 0100 (十进制 4 原码表示)


| 0000 0000 0000 1000 (十进制 8 原码表示)


0000 0000 0000 1100 (十进制 12 原码表示)


3)位逻辑异或实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求异或,


若两个操作数对象同一位不同时,则结果对应位为 1,否则结果中对应位为 0。例如,31 和 22 经过位逻辑异或运算后得到的结果是 9。


0000 0000 0001 1111 (十进制 31 原码表示)


^ 0000 0000 0001 0110 (十进制 22 原码表示)


0000 0000 0000 1001 (十进制 9 原码表示)


4)取反运算符,实际上是将操作数转换成二进制表示方式,然后将各位二进制位由 1 变为 0,由 0 变为 1。


例如,123 取反运算后得到的结果是-124。


~ 0000 0000 0111 1011 (十进制 123 原码表示)


1111 1111 1000 0100 (十进制-124 原码表示)


&、| 和 ^ 也可以用于逻辑运算,运算结果如下表所示:


【示例 10】位逻辑运算符的使用场景。示例代码如下:


移位运算有三个,分别是左移 <<、右移>> 和无符号右移 >>>,这三个运算符都属于双目运算符。左移是将一个二进制操作数对象按指定的移动位数向左移,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用 0 补充。左移相当于乘以 2 的幂,如下图所示:


例如,short 型整数 9115 的二进制是 0010 0011 1001 1011,左移一位变成 18230,左移两位变成 -29076。


右移是将一个二进制的数按指定的位数向右移动,右边(低位端)溢出的位被丢弃,左边(高位端)用符号位补充,正数的符号位为 0,负数的符号为 1。右移位运算相当于除以 2 的幂,如下图所示:


例如 short 型整数 9115 的二进制是 0010 0011 1001 1011,右移一位变成 4557,右移两位变成 2278,运行过程如下图所示:


short 型整数 -32766 的二进制是 0010 0011 1001 1011,右移一位变成 -16383,右移两位变成 -8192,运行过程如下图所示:


无符号右移是将一个二进制的数按指定的位数向右移动,右边(低位端)溢出的位被丢弃,左边(高位端)一律用 0 填充,运算结果相当于除以 2 的幂。例如 int 型整数 -32766 的二进制是 1111 1111 1111 1111 1000 0000 0000 0010,右移一位变成 2147467265,右移两位变成 1073733632,运行过程如下图所示:


【示例 11】位移运算符的使用场景。示例代码如下:


常见错误:byte、short 类型做 >>> 操作时,可能会发生数据溢出,结果仍为负数。从二进制的实现机制来说,byte 类型和 short 类型不适用于 >>> 操作。


6.7 三元运算符


1.格式:


数据类型 变量名称 = 布尔表达式 1 ? 表达式 2 : 表达式 3;


2.执行流程:


(1)计算布尔表达式 1 的结果,看是 true 还是 false


(2)如果布尔表达式 1 的结果为 true,就把表达式 2 的结果赋值给左侧的变量


(3)如果布尔表达式 1 的结果为 false,就把表达式 3 的结果赋值给左侧的变量


执行流程图解:


【示例 13】用三元运算符完成判断一个数字的奇偶性。示例代码如下:


【示例 14】使用条件表达式判断一个数是否是 3 和 5 的公倍数。示例代码如下:


图解分析:


6.8 圆括号


圆括号可以提升公式中计算过程的优先级,在编程中非常常用。如下图所示,使用圆括号更改运算的优先级,可以得到不同的结果。


圆括号还有调整代码格式,增强阅读性的功能。比如下面的这个公式:


6.9 运算符优先级


Java 中的表达式就是使用运算符连接起来并且符合 Java 规则的式子。运算符的优先级决定了表达式中运算的先后顺序。通常优先级由高到低的顺序依次是:自增和自减运算、算术运算、位运算、逻辑运算、赋值运算。如果两个运算有相同的优先级,会以从左到右的方式进行运算。下表显示 Java 中的运算符的优先级。


今日份分享已结束,请大家多多包涵和指点!

用户头像

还未添加个人签名 2021.04.20 加入

Java工具与相关资料获取等WX: gsh950924(备注来源)

评论

发布
暂无评论
华为大佬万字长文总结,梳理的Java入门所有基础知识点,快收藏