java学习 day01_basic
①初识Java
文章目录
- ①初识Java
- 1. Java历史
- 1.1 Java语言的诞生
- 1.2 Java语言的发展历程
- 2. Java主要用途
- 3. JDK和JRE
- 4. Java程序的运行原理
- 5. Java语言的跨平台性
- 6. Java语言的编译性和解释性
- 7. Java开发工具
- ②IDEA的使用
- 1. 基础使用
- 1.1 IDEA创建project
- 1.2 IDEA创建module
- 1.3 project和module的关系
- 1.4 IDEA的src目录
- 1.5 导入IDEA项目
- 2. 必要设置
- 2.2 去掉代码提示的大小写限制
- 2.3 修改IDEA内存大小
- 2.4 将IDEA所有编码改成UTF-8,避免出现中文乱码
- 2.5 其他
- 3. 必要插件
- ③Java语法基础
- 1. 关键字和保留字
- 1.1 关键字(KeyWord)
- 1.2 保留字(ReserveWord)
- 1.3 关键字和保留字的语法意义
- 1.4 Java常见关键字
- 2. 标识符(Identifier)
- 2.1 虚假的标识符命名规则(语法)
- 2.2 真实的标识符组成规则(基于语法的约定)
- 2.3 驼峰命名法
- 2.3.1 小驼峰式命名法(lower camel case)
- 2.3.2 大驼峰式命名法(upper camel case)
- 3. 注释(comment)
- 4. 常量与变量
- 4.1 常量(constant)
- 4.2 变量(variable)
- 4.2.1 声明(declaration)变量
- 4.2.2 初始化(initialization)变量
- 4.2.3 使用变量的注意事项
- 5. 基本数据类型和引用数据类型
- 5.1 基本数据类型(base date type)
- 5.1.1 基本数值类型的取值范围
- 5.1.2 浮点型的精度问题(precision problem)
- 5.2 引用数据类型(reference)
- 5.3 基本数据类型的数据类型转换(conversion)
- 5.3.1 基本数据类型的自动类型转换(automatic)
- 5.3.2 基本数据类型的强制类型转换(cast)
- 6. 原码,反码与补码
- 7. ASCII码表
- 8. 几个常见名词
- ④Java运算符(operator)
- 1. 算术运算符(arithmetic)
- 2. 赋值运算符(assignment)
- 3. 比较运算符(comparison)
- 4. 逻辑运算符(logical)
- 5. 位运算符(shift,了解)
- 6. 三目运算符(ternary)
- 7. 运算符的优先级
- ⑤Scanner键盘录入
- 1. 引入
- 2. 使用步骤
- 3. 重要问题
- Java转义字符(Escape Character)
1. Java历史
1.1 Java语言的诞生
大概是1995年左右,Sun公司的詹姆斯·高斯林(James Gosling )带领团队开发Java语言
虽然不是他一人开发了Java,但是一般来说詹姆斯·高斯林是公认的Java之父
Sun公司在开发这门“新语言”之初,给它起名为Oak(橡树)
但是Oak作为商标已经被注册了,于是经过一番讨论,Sun公司采用了Java这个名字,并申请了商标
Java在英文中的原意是印度尼西亚的爪哇岛(Jawa,在Java问世后改了英文名),以盛产咖啡而闻名
- Java的诞生可以说是应运而生,随着互联网的浪潮而兴起,90年代的互联网的普及是Java诞生的契机
- 它沿袭了C/C++的很多语法和概念,但是又简化、优化、改进了很多地方,使得Java更简洁易学
- 于是Java很快,在2000年左右就成为了最主流(使用人数最多)的编程语言,直至今天
- Java是学习使用人数最多,就业岗位最多的语言
1.2 Java语言的发展历程
1995年5月,在SunWorld大会上,宣布发布Java 1.0版本,并首次提出了著名的“Write Once,Run Anywhere”
1996年1月,JDK 1.0发布,Java语言有了第一个正式版本的运行环境,代表技术为:Java虚拟机(JVM)
1996年5月,Sun公司在旧金山召开了首届JavaOne大会,JavaOne是全世界Java程序员一年一度的交流盛会
1997年2月,JDK 1.1发布,Java语法有了一定的发展,代表语法是内部类,反射,JDBC等
1998年12月,Java迎来了革命性的1.2版本,Sun公司将Java技术体系拆分为了三个方向:
- 面向桌面应用开发的 J2SE(Java 2 Platform,Standard Edition)
- 面向企业级开发的 J2EE(Java 2 Platform,Enterprise Edition)
- 面向手机等移动终端开发的 J2ME(Java 2 Platform,Micro Edition)
J2SE 1.2的代表技术是集合(Collection)体系
2000年5月,J2SE 1.3版本发布,主要改进是升级了Java虚拟机,极大提升了Java执行效率
2002年2月,J2SE 1.4版本发布,1.4版本是Java真正走向商业成熟的一个版本
- 直到现在,仍然有些项目可以运行在1.4版本上
- 1.4的代表技术是异常,正则表达式,日志机制等
2002年同年,微软(Microsoft)公司发布了Java的竞品语言C#以及**.net**平台,极大的影响了Java的发展
2004年9月,J2SE 5.0版本发布,Sun公司摒弃了以往1.X的命名规则,主要原因是:
- “1.5版本的改进是如此的大,以至于我们想用5.0称呼它”
- 微软的.net平台发布没多久,就从1.0直升到了2.0,Sun公司认为1.X命名方式过于保守
J2SE 5.0版本的代表技术是泛型,自动装箱,注解,枚举,可变参数,增强for等
2006年11月,Sun公司由于经营不善,濒临倒闭,于当年的JavaOne大会上宣布开源Java
2006年12月,Java SE 6 发布。这一次Sun公司删除了版本号中的“.0”,重新命名Java技术体系的三个方向:
- 面向桌面应用开发的 Java SE(Java Standard Edition)
- 面向企业级开发的 Java EE(Java Enterprise Edition)
- 面向手机等移动终端开发的 Java ME(Java Micro Edition)
Java 6是Sun公司发布的最后一个Java版本,主要改进是提供了脚本支持,优化了性能
2009年4月,甲骨文(Oracle)公司收购Sun公司,一度辉煌市值超千亿美元的Sun公司湮灭在历史的尘埃中
- 吴军博士的《浪潮之巅》
2011年7月,Oracle公司发布Java SE 7,这是Oracle公司发布的第一个Java版本,是一个过渡版本
- JDK版本分为过渡版本和长期版本
- 过渡版本主要作用是为了让开发者预览新特性,官方不会长期支持修复bug,不稳定
- 长期版本为官方长期关注,并修理bug的版本,稳定
2014年3月,Java SE 8发布,这是Oracle公司发布的第一个Java长期版本,为目前主流商用Java版本
2017年9月,Java SE 9发布,是一个过渡性版本
2018年3月,Java SE 10发布,是一个过渡版本
2018年9月,Java SE 11发布,这是Oracle公司发布的第二个Java长期版本
2019年3月,Java SE 12发布,过渡版本
2019年9月,Java SE 13发布,过渡版本
2020年3月,Java SE 14发布,过渡版本
2020年9月,Java SE 15发布,过渡版本
…
2. Java主要用途
Web应用
- Web应用,说简单点就是通过浏览器(广义,APP也是浏览器)访问的应用,是当前Java最主流的用途
- 普遍来说Web应用无法单机使用,需要浏览器配合服务器端才能使用
- Java是最主流的服务器端语言
Android开发
- 安卓开发已经逐渐式微,越来越少人使用Java开发Android
- Kotlin
- HTML5、Vue
桌面应用开发
- 桌面应用,不需要浏览器,直接运行在桌面操作系统上的应用
- 普遍来说,桌面应用开发是C/C++的天下,桌面应用一般都可以单机使用
- 但是某些特殊情况下,仍然需要使用Java开发桌面应用
- 比如说我现在开发一个桌面软件,非常贴近Java底层
- 比如一些常见的关于Java的组件和开发软件
3. JDK和JRE
JRE(Java Runtime Environment):Java运行时环境
- JRE包括Java虚拟机、运行时核心类库等Java程序运行时必备的环境
- JRE主要是给已经编写好的Java程序使用,也就是说操作系统中想要运行Java程序,必须要有JRE
JDK(Java Development Kit):Java开发者工具包
- JDK包含JRE
- 除了JRE外,JDK还提供了Java开发者需要使用的工具,比如javac.exe,java.exe(Windows)
4. Java程序的运行原理
以Windows操作系统为例
5. Java语言的跨平台性
Write Once,Run Anywhere
Java语言最引以为傲,最显著的特性就是Java的跨平台性
- Java的跨平台性是指Java语言编写的应用程序可以在不同的系统平台上运行
Java实现跨平台性依赖于Java虚拟机(Java Virtual Machine,简称JVM)
- Java程序并不是直接执行在操作系统上的,而是执行在Java虚拟机中
- 每个操作系统平台都有自己独有的Java虚拟机
课堂抽奖
Java可以跨平台吗?JVM可以跨平台吗?
Java可以实现跨平台,Java运行在JVM虚拟机上,它屏蔽了操作系统的差异,使得相同的代码能运行在不同系统上;但是JVM不可以实现跨平台,不同的操作系统有不同的JVM虚拟机。
6. Java语言的编译性和解释性
Java语言是解释型语言?Java语言是编译型语言?
编译执行:通过编译器将源代码编译为机器码(机器能识别的代码指令),然后机器直接执行
解释执行:指由解释器直接执行,不需要编译成机器语言
拿做饭来比喻,源代码就像食材:
解释执行像吃火锅,一边煮一边吃,煮菜的人相当于解释器的地位(源代码一边解释,一边执行)
编译执行像炒菜吃,先把菜炒好再吃,炒菜的人相当于编译器的地位(源代码一次性编译,直接执行)
同样是一个萝卜,完全可以做火锅吃,也可以做炒菜吃,无论怎么吃都只是吃的一种方式罢了
同样的,无论解释执行还是编译执行,其实只是源代码的一种执行方式而已
编程技术发展到现在,用编译型、解释型这种上古时期“教科书”里的定义方式,来分类编程语言已经有点力不从
心了,也不合时宜了
- 例如,C语言是很多人思维中,根深蒂固的编译型语言
- 确实早期的C语言的源代码是通过编译去执行的
- 但实际上随着时代发展,C语言也有了它的解释器实现
- 回到我们的问题本身:
说Java是解释型语言,或编译型语言其实都是不完全正确的
这就像说萝卜必须做火锅吃,不能炒菜吃一样,是很荒谬的
- 那么正确的说法是:Java的某种特定实现是解释型的或者是编译型的
所以,所谓的编译型和解释型并不是语言的特性,而是语言实现的特性
得出启示:
- 不要执拗于概念,学技术是没有教科书的
- 如果真有一本教科书,那么也只能是Java代码的执行结果本身
- 很多概念随着时间和技术的发展,会变得不适用
- 学习技术要多思考,不要人云亦云
7. Java开发工具
开发Java可以使用的工具很多
记事本类:
Notepad(Windows记事本)
Notepad++(弃用)
Sublime Text(主流)
集成开发环境(IDE):
Eclipse(开源免费,有些公司会使用)
MyEclipse(收费,曾经很火,2017版本)
IDEA(收费,但是可以科学使用,目前最火热的)
②IDEA的使用
1. 基础使用
1.1 IDEA创建project
IDEA创建project
- File—>New—>Project或者Create New Project
- 选择JDK版本(8)无需选择模板,直接下一步
- 给project起名
- 工程名一般具有“见名知意”的作用
- 全部英文小写,不要搞中文
- 单词之间用下划线或者横杠连接
- 直接修改location,不要对着name改
- location里可以直接写目录,如果目录不存在,会自动创建
- 创建project的同时默认创建一个module
- 工程的命名并不强制格式,根据公司和leader的安排起名即可
- 其他设置,无需修改,默认即可
- 创建完成,可以选择在当前窗口打开project,还是在新窗口
注意事项
- IDEA中的工程不是一个独立的概念,新建一个project的实质是创建了一个独立的module
- 这个module的名字和project的名字相同
1.2 IDEA创建module
IDEA创建module
- 在一个工程的基础上创建module
- File—>New—>Module
- 选择JDK版本(8)无需选择模板,直接下一步
- 给module起名
- 模块名一般具有“见名知意”的作用
- 全部英文小写,不要搞中文
- 单词之间用下划线或者横杠连接
- 直接修改root,其他部分会跟着改
- 这里的路径非常有讲究
- 如果你希望第二个module和第一个module是同级关系
- 目录路径上要同级
- 如果你希望第二个module在第一个module下面
- 目录路径上要体现上下级
- 总之,目录路径要体现模块之间的关系
- 如果你希望第二个module和第一个module是同级关系
- 点击finish,完成创建
注意事项
- 在JavaSE阶段,没有必要创建多module的project,建议仅创建project
- 到了项目阶段,再学习多module的创建不迟
- 每个project用独立的窗口打开,而不是堆在一个窗口中
- 这样更简洁,每个project都不会互相影响
1.3 project和module的关系
总得来说,project是概念上的顶层结构,module是IDEA的基础结构
- 在IDEA中project是最顶级的结构单元,一个project可以有多个module
- 主流的大型项目结构基本都是多module的,这类项目一般是按功能划分模块,模块之间彼此可以相互依赖
实际会存在以下的关系
- 当为单module项目的时候,这个单独的module实际上就是一个project;
- 当为多module项目的时候,多个模块处于同一个project之中,此时彼此之间具有互相依赖的关联关系
可以把project视为一个工作空间(类似eclipse的workspace)
project并不是一个真实存在的物理结构,只是逻辑上的最高层概念
- 比方说,对于一个学生管理系统的工程(student-manage)
- 创建一个工程(project)叫做student-manage
- 这个工程本身只是一个壳子,实际上创建一个module叫做student-manage
- 可以在这个壳子下面,继续创建新的module
1.4 IDEA的src目录
- 英文单词“source”的缩写,这个缩写以后经常看到,也要经常使用,需要记住
- 基础课程阶段,我们的所有的代码都是写在src目录下
- 也只有写在src目录下的代码,才可以执行
1.5 导入IDEA项目
对于已有的IDEA工程(例如老师每天传的代码)可以直接用IDEA打开,而不是逐个文件的看代码
- File—>Open—>然后选择目标工程
2. 必要设置
IDEA是一个非常棒的集成开发环境,为了提高IDEA的使用效率,有必要对默认设置做出一些修改
- 可以积累自己的IDEA使用经验,积累自己的习惯,工具都是越使用越顺手
- 这里给出一些我的使用习惯,仅作为作为参考
2.2 去掉代码提示的大小写限制
默认情况下,IDEA的代码提示功能会严格区分大小写
例如:输入Sys,IDEA会联想出类System,相反输入sys则不行
这显然是不方便的,可以去掉这个区分大小写的联想
- 按照顺序操作:
File---->Settings----->Editor ----->General-----> Code Completion------>Match Case去掉勾
2.3 修改IDEA内存大小
IDEA默认的内存配置是比较小的,如果电脑的性能不错,可以考虑多给IDEA一些配置
实测后可以提升一些流畅度,也不会影响操作系统整体性能,建议修改
当然,不改也没多大影响,软件运行是否流畅,最终还要看电脑自己的配置
Help----->Edit Custom VM Options
把下面代码框中的代码完全替换到文件中即可
16G内存建议的配置:
# custom IntelliJ IDEA VM options-Xms1024m
-Xmx2048m
-XX:ReservedCodeCacheSize=500m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
2.4 将IDEA所有编码改成UTF-8,避免出现中文乱码
乱码问题是一个很头疼的问题,建议将IDEA的编码格式都修改成UTF-8
尤其是很多同学之前使用过eclipse,默认编码都是GBK,转移代码的时候经常会中文乱码
- 百度IDEA编码改成UTF-8
- 建议都修改一下
2.5 其他
不要给IDEA装很多乱七八糟的插件,包括中文插件,阿里巴巴规范插件等等
3. 必要插件
IDEA是可以装插件的,推荐一些特别好用的插件
在IDEA的设置(setting)里Plugins---->Marketplace下搜索
- Translation
搜索 “Translation” 下载安装重启IDEA,在IDEA代码文件中使用快捷键CTRL+SHIFT+Y可以选词翻译
- Maven Helper (开发必备)
- 管理Maven依赖,排查依赖冲突的神器
- 等学到maven使用后,再装不迟
- Jrebel
- 热部署插件
- 这个插件用来给EE项目部署很好用,等学到EE再装
③Java语法基础
1. 关键字和保留字
学习Java的第一步是要认识关键字和保留字
1.1 关键字(KeyWord)
什么是关键字?关键字有什么特点?
关键字是被Java语法赋予特定含义的单词
关键字都是合法的单词,必须全部小写
关键字有什么作用?
- 关键字对编译器有特殊意义(影响编译)
- 他们用来表示一种数据类型或者表示程序的结构
1.2 保留字(ReserveWord)
什么是保留字?保留字有什么作用
保留字是对当前版本的Java,并没有特殊含义的单词
但是以后的版本中,Java官方可能会将其变成具有特殊含义的单词,升级为关键字
即便以后也不打算升级为关键字,但是Java官方认为你不应该在Java代码中使用的单词,也会变成保留字
有哪些保留字?
Java目前有且仅有两个保留字
- const
- goto
1.3 关键字和保留字的语法意义
关键字和保留字对Java程序有显著影响
- 关键字和保留字均不能用作变量名、方法名、类名、包名和参数
- 由于大家使用比较高级的集成开发环境,关键字是有特殊颜色标记的
课堂抽奖
以下哪些是关键字(保留字)?
class,HelloWorld,public,static,Const,void,main,String,System,goto
1.4 Java常见关键字
关键字 | 含义 |
---|---|
abstract | 表明类或者成员方法具有抽象属性 |
assert | 用来进行程序调试 |
boolean | 基本数据类型之一,布尔类型 |
break | 提前跳出一个块 |
byte | 基本数据类型之一,字节类型 |
case | 用在switch语句之中,表示其中的一个分支 |
catch | 用在异常处理中,用来捕捉异常 |
char | 基本数据类型之一,字符类型 |
class | 类 |
const | 保留关键字,没有具体含义 |
continue | 回到一个块的开始处 |
default | 默认,例如,用在switch语句中,表明一个默认的分支 |
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 | 用在循环结构中 |
2. 标识符(Identifier)
什么是标识符?标识符有什么用?
- 标识符是给包,类,接口,方法,变量等起名字时使用的字符序列
- 标识符就是起名字时用的字符串
2.1 虚假的标识符命名规则(语法)
语法上要求的标识符的规则是什么?
- 标识符的组成
- 数字(0~9)
- 字母(A~Z 和 a~z)
- 美元符号($)
- 下划线(_)
- Unicode 字符集中符号大于0xC0的所有符号
- 标识符的开头
- 字母(A~Z 和 a~z)
- 下划线(_)
- 美元符号($)
- Unicode 字符集中符号大于 0xC0 的所有符号
- 注意事项
- 标识符不能以数字开头
- 不能是Java中的关键字和保留字
- 标识符区分大小写
课堂抽奖
以下标识符命名合法的有哪些?
HelloWorld,_985,$bS5_c7,class,长风,Class ,DataClass#,98.3,Hello World,好きだ
2.2 真实的标识符组成规则(基于语法的约定)
以上只是语法范畴的标识符规则,但就像人可以起名叫“张三,李四”,但几乎没人这么做一样
在符合语法的前提下,标识符还有一套约定俗成的命名规则,详见《阿里巴巴Java开发规范》
真实的标识符组成规则
- 符合语法
- 只能用英文字母、数字(下划线特殊场景使用并且不能作为开头,美元符号几乎不使用)
- 包命名标识符
- Java中的包类似操作系统中的文件夹
- 包用来区分同名Java文件
- 包用来区分访问权限
- 包的命名,以反转公司域名为规范
- 包名应该全部小写
- 多级包名以点(.)分隔
- Java中的包类似操作系统中的文件夹
- 类、接口等命名标识符
- 大驼峰命名法
- 变量、方法的命名标识符
- 小驼峰命名法
- 常量的命名标识符
- 全部大写(建议)
- 多个单词之间用下划线(_)隔开
为了方便大家后续看代码,我会给包名加序号表示我们上课的顺序,但是大家开发中不要这么做
给人起名字也追求好听吉祥,标识符起名也有自己的追求
核心追求是“见名知意”,应该赋予标识符一个有意义、有用途的名字
标识符的命名规范,可以从源码、大神的代码中学习,也是一个逐渐积累的过程
课堂抽奖
以下哪些标识符的命名规则符合规范
public class student{}
public class TestDemo{}
int Num;
String name;
public class Persondemo{}
包名 Test.Demo
包名 com.baidu
int nianling;
String 名字;
2.3 驼峰命名法
2.3.1 小驼峰式命名法(lower camel case)
- 多个单词组合成一个字符串
- 第一个单词的首字母小写
- 从第二个单词开始,首字母都要大写
- 例如:myName,myFirstJavaProgram
2.3.2 大驼峰式命名法(upper camel case)
- 多个单词组合成一个字符串
- 第一个单词的首字母大写
- 从第二个单词开始,首字母都要大写
- 例如:MyName,MyFirstJavaProgram
如何写出让同事无法维护的代码呢?(并成为公司中的头号“重要人物”)
- **容易输入的变量名。**比如:qwer,asdf等
- 让人摸不透你的心思
- 单字母的变量名。比如:a,b,c,x,y,z(如果不够用,可以考虑 a1,a2,a3,a4,….)
- 体现了极简的编程风格
- **有创意地拼写错误。**比如:getStuedntAge,prnitTeacher等
- 这样写同事根本无法准确定位问题
- 不太大众化的缩写。比如:WTF,RTFSC …… (使用拼音缩写也同样给力,比如:BT,TMD等)
- 没有较强的联想能力还来做程序员?
- **单纯使用下划线。**比如:命名为“–”
- **使用不同的语言。**比如混用英语,德语,或是中文拼音。
- **l和1一起用。**字母 l 和数字 1 有时候是看不出来的。
- 乱写注释。比如注释和实际代码不同,注释中写废话等等
。。。
3. 注释(comment)
什么是注释?
- 注释是可以嵌入到Java代码的任何位置的,一种解释说明性的文字
注释有什么作用?
- 方便自己写代码的时候,记录程序的信息
- 增加代码的可读性
- 过段时间后,自己也能很快想起来,自己写的代码是干什么的
- 最重要的,方便别人能看懂自己的代码
- 写注释可以增加自己写代码的逻辑性
- 编码之前先用注释,标注好需要做的事情,先搞明白思路,再写代码
- 编码实际上就是思想的体现
- 注释也可以作为一种比较简单但十分好用有效的,debug的方式
- 将可能出错的代码注释掉,再运行程序,直到找出bug
- 这种方式虽然看起来很笨,实际上用途很大,不要忘记它
注释的语法
Java支持三种注释的语法格式
单行注释
//注释的文字
多行注释
/* 注释的文字 */
文档注释
/** 注释的文字 */
注释的使用注意事项
- 多行注释和文档注释不要嵌套使用
- 注释不参与编译,编译器会自动丢掉代码中的注释部分
- 和注释类似,空白行也不参与编译,所以在Java代码中加入空白行是不影响代码执行的
- JDK中提供了javadoc.exe工具,用于将文档注释输出到一个HTML文件中
4. 常量与变量
程序运行中,内存中有很多数据参与运算
- Java使用变量来存储这些数据
- 程序运行中,值不变的变量就是常量
4.1 常量(constant)
什么是常量?
- 在程序运行过程中,其值不会发生改变的量
常量有哪些分类?
- 字面值常量(literal)
- 字符串常量:双引号引起来的内容
- “Hello World!”
- 整数常量:所有的整数
- 1,2,3
- 小数常量:所有的小数
- 1.1,1.2
- 字符常量:单引号引起来的内容
- ‘W’,‘E’,
- 布尔常量
- 只有true和false
- 空常量,针对引用数据类型
- 只有null
- 字符串常量:双引号引起来的内容
- 自定义常量(custom,面向对象详细讲)
4.2 变量(variable)
什么是变量?
- 程序运行期间,其值在某个范围内,可能会发生改变的量
- 需要强调的是,变量指的是该数据的值可能会发生变化的可能性,只要有可能改变,这个量就是变量
怎么定义一个能够使用的变量
- 两步走:先声明变量,再初始化变量(赋值)
4.2.1 声明(declaration)变量
什么是声明变量?
- 告诉编译器,变量的数据类型,变量的名字
声明变量的语法
数据类型 变量名;
课堂抽奖
- 声明后的变量能够直接使用吗?
4.2.2 初始化(initialization)变量
什么是初始化变量
- 就是给变量赋值,声明一个变量后,必须由程序员显式的进行赋值操作,这个变量才能够使用
初始化变量的语法
变量名 = 变量值;
声明和初始化可以合起来
数据类型 变量名 = 变量名;
4.2.3 使用变量的注意事项
- 注意:Java当中的整数字面值常量,默认当作int处理
- 如果你想要一个整数字面值常量数据类型为long,需要在后缀上加l或L,推荐L
- 注意:Java当中的浮点数,默认当作double处理
- 如果你想要一个浮点数字面值常量数据类型为float,需要在后缀上加f或F,推荐F
- 变量有效的范围,这个范围通常用{}来界定,同样一个{}不能有同名变量
- 变量必须显式初始化,只有声明的变量无法使用它
- 一行一个语句可以定义多个同数据类型的变量,用逗号隔开
- 但是一行定义多个变量会影响代码的阅读性,一般不要一行定义多个变量
- 浮点型有精度问题,需要特别注意
- 一般来说,开发中不会使用浮点类型进行计算,尤其是财务系统等对数值敏感的地方
5. 基本数据类型和引用数据类型
Java是强类型语言,每一个变量都必须有它的数据类型,并且变量之间不能随便转换数据类型
- 主流的语言大多都是强类型 C、C++、Java、Python
弱类型语言,变量之间转换类型比较方便
- PHP
什么是数据类型?
- 数据类型,表示的是一个数据集合和基于该数据集合的一组合法操作
数据类型怎么分类?
- 基本数据类型:JDK默认提供
- 引用数据类型
- 类
- 接口
- …
5.1 基本数据类型(base date type)
有哪些基本数据类型?
四类八种
- 整型
- byte:字节,1个字节空间
- short:短整型,占2个字节空间
- int:整型,占4个字节空间
- long:长整型,占8个字节空间
- 浮点型
- float:单精度浮点型,占4个字节
- double:双精度浮点型,占8个字节
- 字符类型
- char:占2个字节,表示单个字符
- 布尔类型
- boolean:具体占多少内存,分两种情况,了解即可
- 根据JVM规范,在内存中boolean当作int处理,占4个字节
- boolean数组当成byte数组处理,一个boolean元素占1个字节
- boolean:具体占多少内存,分两种情况,了解即可
注意:string不属于基本数据类型,而是引用数据类型
5.1.1 基本数值类型的取值范围
基本数据类型 | 字节长度 | 大小(位) | 最小值 | 最大值 | 取值范围 |
---|---|---|---|---|---|
byte | 1字节 | 8bit | -2^7 | 2^7-1 | -128 ~ 127 |
short | 2字节 | 16bit | -2^15 | 2^15-1 | -32768 ~ 32767 |
int | 4字节 | 32bit | -2^31 | 2^31-1 | -2147483648 ~ 2147483647(21亿出头) |
long | 8字节 | 64bit | -2^63 | 2^63-1 | -9223372036854774808 ~ 9223372036854774807(大概922亿亿) |
float | 4字节 | 32bit | - | - | -3.403E383.404E38(有效位数78位) |
double | 8字节 | 64bit | - | - | -1.798E3081.798E308(有效数字1617位) |
5.1.2 浮点型的精度问题(precision problem)
什么是精度问题?
计算的结果的数据类型,或者新的数据类型无法容纳全部的数据,导致部分信息被截断丢失,数据失真
专业名词就叫做“精度丢失”
经典的案例
- 计算10/3.0
- 计算1-0.9
- 二进制表示0.1
正数十进制转换成二进制,除2直到商为0,取余数倒过来
负数十进制转换成二进制,先算出正数的二进制数,取反+1
正小数转换成二进制,用小数部分乘以2,取结果的整数部分(必然是1或者0),
- 然后小数部分继续乘2
- 直到小数部分为0,或者已经达到了最大的位数
- 最终的结果(0.开头)正序排列
- 结论:
float和double类型主要是为了科学计算和工程计算而设计的
它们执行的二进制浮点运算,是在广泛的数字范围上较为精确而快速的近似计算
所以直接使用float和double类型做浮点运算很容易出现误差,也就是精度损失
我们不应该把它们用于精确计算的场合,尤其不适合用于货币运算
- 最好的解决办法是用BigDecimal 替代float和double进行浮点数计算
5.2 引用数据类型(reference)
碍于知识点的限制,目前只要知道字符串(String)是一种引用数据类型即可
String属于引用数据类型中的类
5.3 基本数据类型的数据类型转换(conversion)
什么是数据类型转换呢?
- Java是强类型语言,变量一旦声明后,数据类型不会轻易改变,但也并非完全不可能改变
- 我们将Java中变量的数据类型由某一种转换为另一种,这个过程叫做数据类型转换
数据类型转换的分类
- 自动类型转换,也叫向上转型
- 向上转型只是自动类型转换的一种说法,这种说法只针对引用数据类型
- 强制类型转换,也叫向下转型
- 向下转型只是自动类型转换的一种说法,这种说法只针对引用数据类型
5.3.1 基本数据类型的自动类型转换(automatic)
什么是自动类型转换?
- 数据类型无需程序员操作,由编译器自动转换
基本数据类型的自动类型转换的规则
“小取值范围”转换为“大取值范围”发生自动类型转换(浮点数都比long取值范围大)
- byte、short、char之间不互相转换,一旦之间发生运算,一律自动转换为int进行运算,结果是int
- byte、short、char任一数据类型与int进行计算,一律自动转换为int进行计算,结果是int
- byte、short、char、int任一数据类型与long进行计算,一律自动转换为long进行计算,结果是long
- byte、short、char、int、long任一数据类型与float进行计算,一律自动转换为float进行计算,结果是float
- byte、short、char、int、long、float任一数据类型与double进行计算,一律自动转换为double进行计算,结果是double
精度问题
“小容量”不一定是“小取值范围”——所有浮点类型都比long取值范围大
但是由于浮点数本身的问题,整型的内存表示方式也和浮点型完全不同,很容易产生精度丢失
- 当int、long(4字节,8字节)自动转换成float(4字节)时,可能会有精度损失
- 当long自动转换成double(8字节)时,也可能产生精度损失
- 不要用浮点型计算小数,除非对精度十分不敏感
以下图中,实线虚线都表示可以发生自动类型转换
- 实现表示不会有精度问题
- 虚线表示可能会产生精度丢失
5.3.2 基本数据类型的强制类型转换(cast)
什么是强制类型转换
- 数据类型的转换需要程序员显式操作,否则编译器报错
什么时候需要强制类型转换
- 在特别有必要的情况下,把一个“大取值范围”的数据类型,转换成“小取值范围”的数据类型,比如int---->byte
- 如果不是特别必要,不要做这种操作,因为很容易丢失精度
语法
目标数据类型 变量名 = (目标数据类型)(被转换的变量变量名);
精度问题
- 强制类型转换,大变小,精度损失是很常见的
- 强烈建议:除非是非强转不可,不要使用强制类型转换,稍有不慎会导致bug
- 进行强制类型转换,要严格考量,数据类型的取值范围,像(byte)200这种行为是很滑稽的
补充
- boolean类型和其他数 据类型之间不能通过强制类型转换语法直接转换
- 0 = false ,1 = true
基本数据类型的类型转换,可以总结出以下规律:
- 八种基本数据类型中,只有boolean类型不能直接进行类型转换,其他七种都可以互相转换
- byte、short、char使用的时候尤其注意取值范围,若参与运算都会自动提升到int
- ”小取值范围“—>“大取值范围”称之为自动类型转换,不需要写代码处理,排序是
- byte < short(char) < int < long < float < double
- “大取值范围”—>“小取值范围”称之为强制类型转换,必须要显式处理,否则报错
- 需要注意强制类型转换,很容易丢失精度,慎用
- 多种数据类型混合在一起进行运算,先全部提升为“最大取值范围”的数据类型,再进行计算
小练习1
哪句是编译失败的呢?为什么呢?
byte b1 = 1, b2 = 2, b;
b = b1 + b2; // 编译失败
b= 1 + 2; //编译成功,1+2是确定数值,且不超过表示范围,编译器可以识别出来
小练习2
这句代码有没有问题?
如有问题,咋整?
byte b = 130;
小练习3
请写出下列程序结果
System.out.println('a'); //aSystem.out.println('a'+1); //98System.out.println("hello"+'a'+1); //字符串等级最高,拼接,helloa1System.out.println('a'+1+"hello");//98helloSystem.out.println("5+5"+5+5);//5+5=55System.out.println(5+5+"=5+5");//10=5+5System.out.println(5 + 5.0);// 10.0System.out.println(5+"5"+5.0);// 555.0
几个启示
- 语句中1或者2都是字面值常量,字面值常量互相做运算仍然是常量。我们常说的1默认是int类型,是说可以用int类型的变量来接收它
- 强转会有精度损失,不要轻易做强转
- 运算式中会发生数据类型的自动转型,称之为“表达式的类型提升”
- 结果必然是自动提升后的那个数据类型
- String(字符串)在表达式中是最高的类型
6. 原码,反码与补码
有符号的数据表示法——原码,反码,补码
计算机中的数据是二进制的,不像生活中用符号表示负数一样那么简单,在计算机中,有符号数的表示分为三种
注意:所有的数据运算都是采用补码形式进行
- 原码
- 有效数字是其绝对值的二进制表示
- 最高位负数是0,正数是1
- 有效数字和最高位之间用0补充
- 除了最高位符号位外,其余位置都是数值位
- 反码
- 正数的反码与原码相同
- 负数的反码是对其原码逐位取反,符号位除外
- 补码
- 正数的补码与原码相同
- 负数的补码是在其反码上加1
- 反码+1=补码
- 反码=补码-1
- 做原反补码运算的经典错误: 用负数的方式去算正数的原反补码
7. ASCII码表
ASCII ((American Standard Code for Information Interchange):美国信息交换标准代码)
是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
8. 几个常见名词
赋值,初始化(initialization),定义(defined),声明(declaration)
声明:声明一个变量,和它的字面意思一样,是告诉编译器有这个变量存在,是个什么类型的变量
- 但是如果仅仅声明变量,编译器会忽略掉这个只声明的变量
- 当程序执行时,该变量不会去开辟内存空间,内存中不存在该变量
- 查看反编译文件当中的局部变量表
- 仅仅声明的变量是不能够使用的
- 声明方法这种说法也是可以的,含义和定义方法一样
- 但是如果仅仅声明变量,编译器会忽略掉这个只声明的变量
初始化:初始化是从无到有的过程
- 声明变量后,需要对变量进行初始化才能使用,初始化和赋值在C/C++中是有严格区别的
- 严格来说,初始化指的是第一次给成员变量赋值,也就是和声明写在一起才能称之为初始化
- 但是在Java中区分初始化和赋值的意义不是很大,建议也不要对它进行区分
赋值:变量声明初始化后,再去改变变量的取值,就是一个赋值的过程
定义:严格来说,定义指的是声明并且初始化一个变量,但实际上没有必要这么狭隘的去理解
- 广义来说,定义类,定义方法也没问题
④Java运算符(operator)
程序的世界里,数据无处不在,计算机的最基本用途之一就是执行数学运算
Java作为一门程序设计语言,提供了丰富的运算符来操纵变量(从这个角度,运算符起着连接变量名字的作用)
- 运算符用于连接值(变量和常量)
运算符是一种特殊的符号,用以表示数据的运算,赋值和比较等
不同的运算符用来完成不同的运算,运算都有结果,所以表达式往往都有结果
- 表达式经过运算后都会产生一个确定的值(会有结果)(重要)
和表达式对应的还有一个语句的概念
表达式(expression) vs 语句(statement)
- 表达式一般都有确定的结果(值),不能构成一条能单独执行的代码(往往不能以分号结尾)
- 语句都是可以单独执行代码,以分号结尾,多数语句没有结果
运算符的分类:
- 一元运算符:只需要一个操作数参与运算,得到一个结果
- 二元运算符:需要两个操作数参与运算,得到一个结果
- 多元运算符:超过两个操作数参与运算,得到一个结果
1. 算术运算符(arithmetic)
算术运算符用在数学表达式中,它们的作用和在数学中的作用一样
- 自增、自减是典型的一元运算符
于是:
对于int a = 10,int b =20,可得到以下表格
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法:相加运算符两侧的值,得到和 | a+b=30 |
- | 减法:左操作数减去右操作数,得到差 | a-b=-10 |
* | 乘法:相乘操作符两侧的值,得到积 | a*b=200 |
/ | 除法:左操作数除以右操作数,得到商 | a/b=0 |
% | 取余(取模):左操作数除以右操作数,得到余数 | a%b=10 |
++ | 自增:操作数的值增加1 | a++一次是11 |
– | 自减:操作数的值减少1 | a–一次是9 |
+(字符串运算、表示正数) | 无论什么数据类型和字符串用“+”相加,得到字符串 |
加减乘除取余注意事项
- 整型相加减乘除得不到小数
自增(++)/自减(–)是面试题目常客
- 自加自减,仅适用于变量,常量无法用自增自减运算符连接
- 当变量和自增自减符号,单独构成一个表达式语句,孤零零的放在那里
- 其含义就是表示执行一次该操作数,加一或者减一
- 自增、自减符号放在变量前面还是后面,无关紧要
- 变量和自增自减符号,单独构成一个表达式后又参与了运算或者输出语句
- 自增自减符号和操作数的位置就至关重要了
- 自增自减符号在变量前面,变量先自增自减,再参与后续运算或者赋值
- 自增自减符号在变量后面,变量先参与运算或者赋值,再自增自减
小试牛刀
第一题:求a,b,c,d的值
int a = 10;
int b = 10;
int c = 10;
a = b++;
c = --a;
b = ++a;
a = c--;
第二题:求x,y值
int x = 4;
int y = (x++) + (++x) + (x*10);
- 如果你不是为了出面试题,不要在开发中这样使用自增自减
2. 赋值运算符(assignment)
什么是赋值运算符?
- 赋值运算符用来为变量指定新值
- 赋值运算符是典型的二元运算符
- “==”不是赋值运算符
赋值运算符分为两类
- 基本的赋值运算符:“=”
- 扩展的赋值运算符(extension): 如:“+=”、“-=”、"*="、“/=”等
- 无论是哪一种,赋值运算符总是把右边的操作数(计算后)赋值给左边
- 所以,左边必须是一个变量来接收这个赋值
- 当右边是字面值常量时,扩展赋值运算符是一种扩展的自增
对于两个操作数a,b
操作符 | 描述 | 例子 |
---|---|---|
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | a + = b等价于a = a + b |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | a - = b等价于a = a - b |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | a * = b等价于a = a * b |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | a / = b等价于a = a / b |
%= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | a%= b等价于a = a%b |
<< = | 左移位赋值运算符 | a << = 2等价于a = a << 2 |
>> = | 右移位赋值运算符 | b >> = 2等价于b = b >> 2 |
&= | 按位与赋值运算符 | a&= 2等价于a = a&2 |
^ = | 按位异或赋值操作符 | a ^ = 2等价于a = a ^ 2 |
| = | 按位或赋值操作符 | b | = 2等价于b = b | 2 |
小试牛刀
判断下列代码是否报错呢?
short s = 1;
s = s + 1; //1是int,不能变为short,会报错,但如果不是赋值给s,是一个int类型,是可以的
short s1 = 1;
s1 += 1; //扩展的赋值运算符有强制类型转换
注意事项
对于扩展赋值运算符而言,如果右边运算式得到的结果和左边不同,则会自动发生强制类型转换
int x = 0; x = x + 3.5; //报错
int x = 0; x += 3.5
上述两个表达式,其含义是一样的,但只有第二个是合法的,说明扩展赋值运算符隐含强转
x += y <----> x = (x的数据类型) (x + y)
扩展赋值运算符的隐含强转,仍然会存在精度丢失
赋值运算符构成的赋值表达式,仍然有结果,其结果是赋值表达式右边要赋给左边变量的值
3. 比较运算符(comparison)
什么是比较运算符
- 比较运算符用来判断两个变量或者常量的大小
- 比较运算符是典型的二元运算符
- 注意:比较运算符和操作数组成的表达式的结果是一个boolean值( true或者false)
- 也叫布尔表达式
使用注意事项
- 基本数据类型和基本数据类型比,引用数据类型和引用数据类型比
- “==”和“!=”可以用于引用数据类型之间相比较,其余比较运算符则不行,比较的是地址
- 对于数值类型基本数据类型而言,纯粹比较运算符两边的操作数的值
- 和数据类型无关,也不会发生数据类型转换
- 对于浮点数而言,精度问题尤其重要
对于操作数int a = 10,int b = 20
运算符 | 描述 | 例子 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (a == b)为假。 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (a != b) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (a > b)为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (a < b)为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (a >= b)为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (a <= b)为真。 |
4. 逻辑运算符(logical)
什么是逻辑运算符?
- 专门boolean类型进行计算的运算符,可以连接布尔表达式,也可以连接布尔变量、布尔常量
- 逻辑非运算符是典型的一元运算符,其余逻辑运算符都是二元运算符
- 逻辑运算表达式的结果也一定是boolean
对于 boolean a = true; boolean b = false
操作符 | 描述 | 例子 |
---|---|---|
& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (a & b)为假 |
| | 称为逻辑或运算符。如果任何两个操作数任何一个为真,条件为真。 | (a | b)为真 |
^ | 成为逻辑异或运算符。相同时为false,不同时为true | (a ^ b) 为真 |
&& | 称为短路与逻辑运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假 |
|| | 称为短路或逻辑运算符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真 |
! | 称为逻辑非运算符,用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真 |
短路与不短路有啥区别?
短路时,若第一个操作数已经能够决定表达式的值了,后面就都不算了
计算结果不变,但是执行效率变高了
有些书籍里,不把&和 |列入逻辑运算符中,而是直接称之为位运算符
实际开发,&&、||、!最常用
5. 位运算符(shift,了解)
什么是位运算符?
确切的说,应该叫”移位运算符“
位运算符是直接对整数的二进制位进行计算的运算符
移位运算符、或、与、异或位运算符是二元运算符
按位取反位运算符是一元运算符
对于int a = 60;b=13有以下规则
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (a&b),得到12,即0000 1100 |
| | 如果相对应位都是0,则结果为0,否则为1 | (a | b)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (a ^ b)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜a)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。在一定范围内,每左移一位,相当于乘以2 | a << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。在一定范围内,每右移一位,相当于除以2 | a >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
右移和左移的实质
- 左移就是把左边移出去的高位截断,在低位补数,无论原先的数是正是负,空位都补0
- 在一定范围内,M << n 可以这么算 M << n = M * 2^n
- 右移就是把右边移出去的低位截断,在高位补数,正数补0,负数补1
- 在一定范围内,M >> n 可以这么算 M >> n = M / 2^n,如果是整数很容易精度损失,丢失小数位
有符号移位和无符号移位的区别
- "<<"有符号左移的时候,情况比较简单,被移除的最高位丢弃,空缺位补0
- “>>”有符号右移的时候
- 若是正数,最高位是0,被移除的低位丢弃,右移后最高位空缺位补0
- 若是符号,最高位是1,被移除的地位丢弃,右移后最高位空缺位补1
- “>>>”无符号右移动的时候,无论是正数负数,最高位是0还是1,被移除的低位丢弃,右移后最高位空缺位补0
&、| 、^(与、或、异或)位运算符
~取反位运算符
^异或位运算符
数学中,表示次幂,但是在Java中显然不是次幂,那么该怎么求一个数的次幂呢?
- Math.pow()
- Math是一个工具类,里面装的是有关数学的一些操作
经典操作
- 怎么算 2*16 最高效?
6. 三目运算符(ternary)
什么是三目运算符
- 三目运算符也被称之为三元运算符,指的是需要三个操作数的运算符
语法
(条件表达式)?表达式1:表达式2
当条件表达式为true时,执行表达式1,否则执行表达式2
三目运算符最大的特点就是它一定会执行一个表达式,一定会有结果
语句不能放在表达式的位置,这极大的限制了三目运算符的使用
练习
获取两个整数中的最大值
获取三个整数中的最大值
两次三目运算, 第一次求出两个之间的最大值,再和另一个去比较
注意
- 实际开发中,不要使用过于复杂的三目运算符,否则会导致程序可读性变差
7. 运算符的优先级
运算符的优先级决定了谁先进行运算,是既重要也不重要的知识点
重要在于,运算符的优先级对表达式结果有显著影响,不重要在于可以用()主动控制优先级
Java当中运算顺序
- 所有的数学运算都认为是是从左向右的,java语言中大部分运算符也是从左向右的结合的
- 只有单目运算符,赋值运算符,三目运算符例外
- 其中单目运算符,赋值运算符合三目运算符是从右向左结合,也就是从右向左运算的
- 三目运算符实际上是一种选择结构
运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序
下表中列出了运算符的优先级顺序,编号越小的运算符优先级越大
编号 | 类别 | 操作符 | 计算顺序 |
---|---|---|---|
0 | 后缀 | () [] . (点操作符) | 左到右 |
1 | 一元 | + + - !〜 | 从右到左 |
2 | 乘性 | * /% | 左到右 |
3 | 加性 | + - | 左到右 |
4 | 移位 | >> >>> << | 左到右 |
5 | 关系 | >> = << = | 左到右 |
6 | 相等 | == != | 左到右 |
7 | 按位与 | & | 左到右 |
8 | 按位异或 | ^ | 左到右 |
9 | 按位或 | | | 左到右 |
10 | 逻辑与 | && | 左到右 |
12 | 逻辑或 | | | | 左到右 |
13 | 条件 | ?: | 从右到左 |
14 | 赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
15 | 逗号 | , | 左到右 |
- 优先级很长,记忆很痛苦,即便记住,忘记也很快
- 实际上没有人会真的死记硬背优先级,必要时可以在表达式中使用小括号,小括号的优先级最高
- 不要写太长的表达式,你是在出面试题吗?
- 过于复杂的表达式,分几步完成
- 对于代码而言,可读性最重要
- 虽然我们无需具体记忆这些优先级,但是仍然需要记住—赋值运算符的优先级往往最低
⑤Scanner键盘录入
1. 引入
我们目前在写程序的时候,数据值都是固定的。但是实际开发中,数据值肯定是变化的
- 实际开发中,这些变化的数据往往都是来自于前端页面(用户输入,上传等)
- 所以总体而言,Scanner对于Web开发并没有太大的实际作用,了解即可
- 在SE的学习阶段,在单机的情况下,使用键盘录入是很不错的选择,可以提高程序的灵活性
- 而在某些测试的场景中,使用Scanner键盘录入也有一定的用途,所以Scanner也有必要学习了解一下
2. 使用步骤
怎么玩呢?
提出三步走计划
导包 (IDEA有自动导包功能,但是不要认为没有这一步)
import java.util.Scanner;
创建对象
Scanner sc = new Scanner(System.in);
接收从键盘录入的数据
int x = sc.nextInt();
注意事项
- 目前阶段,记住步骤会使用就行。以后再来具体分析每步在做什么
- 一般为了方便使用,应该加上提示键盘输入的输出语句
3. 重要问题
Scanner的使用问题
- next()、nextInt()等一系列方法和nextLine()的区别
- next()、nextInt()等一系列方法
- next()之类的一系列方法遇见第一个有效字符(非空格,非换行符,非制表符)时,开始扫描
- 当遇见第一个分隔符或结束符(空格、换行符或者制表符)时,结束扫描,获取扫描到的内容,所以多个next挨着时,比如123 879会被赋值到两个变量中
- 即获得第一个扫描到的不含空格、换行符的单个字符串
- nextLine()方法
- 从方法名上就可以看出来,这个方法是获取一行的内容作为一个字符串被接收
- 该方法不会因为空格或制表符号而结束扫描
- 只会因为回车(换行)而结束扫描
由于nextLine()方法碰到换行才结束扫描的特性,所以使用有如下问题:
当使用Scanner接收数值类型后又使用nextLine()方法接收字符串时,输入数值后回车
会导致程序并不会接收一个字符串,而是直接结束键盘录入
但是连续两次nextLine()貌似没有问题
- 究其原因在于,nextLine()方法碰到回车就结束扫描,所以该方法此时接收的实际上是一个(绝对)空字符串
解决办法有很多种
- 可以使用不同的Scanner对象接收,这样肯定不存在冲突问题
- 在接收int数据的后面加一个不接收数据的nextLine用来接收回车
- 用next()方法接收字符串,但是需要注意该方法以分隔符结束,不再是接收一行了
- 可以统一用字符串接收数值类型,接收完毕后再进行类型转换
Integer.parseInt()传入一个字符串,转换成int
Java转义字符(Escape Character)
所谓转义字符,就是用反斜杠(\)加上一个特殊的字符串用来表示一个全新的字符
因为这个字符已经和原先字符串的意思大不相同,所以称之为转义字符
转移字符最重要的用途是表示ascii码当中,无法用键盘直接输入的控制字符
- 所有的转义字符和所对应的意义:
转义字符 | 意义 | ASCII码值(十进制) |
---|---|---|
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\\ | 两个反斜杠表示一个反斜杠 | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\ddd | 1到3位八进制数所代表的任意字符 | Unicode编码前256个字符 |
\0 | 空字符,什么都没有 | 000 |
\uxxxx | 4位十六进制所代表的任意字符 | Unicode编码前65536个字符 |
\u0000 | 空字符,什么都没有 | 000 |
需要特殊强调的是:
- \ddd,它的取值范围为 \0 ~ \377,十进制就是0~255
- \uxxxx,它的取值范围为\u0000 ~ \uFFFF,十进制就是0~65535
- 标注加重颜色的,较为常用,其它的了解即可
反斜杠(\)和斜杠(/)不要混淆了
- 反斜杠(\)是计算机出现了之后发明的专用符号,生活中几乎不应该使用反斜杠
java学习 day01_basic相关推荐
- Java学习路线图,如何学习Java事半功倍?
作为一个初学者想掌握Java并不是很容易,Java本身是具有一定难度的,虽然说兴趣这东西可以让我们学习不累,但是有多少人学习是因为兴趣,或者有多少人知道自己的兴趣在哪?所以我很明确的告诉你学习这事本来 ...
- Java学习必不可少的网站,快收藏起来
java技术在IT互联网行业的发展前景一直在提升,越来越多的人都在学习java技术,今天小编来给大家提供一些学习Java的网站集合,希望能够帮助到正在学习java技术的同学. Java学习必不可少的网 ...
- 分享五款java学习辅助工具,总有你用的上的~
想要学好java技术,除了自身的努力,辅助工具也不缺少,辅助工具可以帮助大家在今后的工作中可以提高工作效率,下面小编就来分享五款java学习辅助工具,总有你用的上的~ 五款java学习辅助工具: 1. ...
- Java学习从入门到精通的学习建议
想要学好java技术,首先打好基础很重要,不论学什么基础都是重中之重,学习Java更是如此.如:基础语法.核心类库.面向对象编程.异常.集合.IO流等基础如果学不好,那么后边更深入的语法也不容易学会. ...
- java学习笔记11--Annotation
java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
- JAVA学习资源网站
中文java技术网--http://www.cn-java.com/ 灰狐动力(http://www.huihoo.com/)-- 该站点有许多的开源的项目的介绍和学习,涉及操作系统,数据库等许多方向 ...
- 我的WEB之路(一)-2.JAVA学习路线
第一阶段:针对性夯实JAVA基础 课程名称 核心要点 完成目标 Java基础入门 搭建Java开发和运行环境等,IDE工具的学习和使用,Java语言基础,数据类型,运算符,条件和循环,数组使用等,Ja ...
- 准备写java学习笔记
准备写java学习笔记 java int 转载于:https://blog.51cto.com/cryingcloud/1975267
最新文章
- 【总结】sqli-labs Less(1-35) 小结
- BZOJ1058 [ZJOI2007]报表统计 set
- python访问多个网站_Python多并发访问网站
- 内存溢出原因及解决方案
- vsftpd配置文件详解 ---配置解说
- 学习工作即游戏:游戏化生存的现实物语
- ReactNative 告别CodePush,自建热更新版本升级环境
- 【TensorFlow】学习资源汇总以及知识总结
- CTO职场解惑指南系列(一)
- 特斯拉回应Model 3新车无USB接口:芯片短缺
- 程序人生001--点滴感悟-随笔01
- SQLi LABS Less 10 时间盲注
- Spring Cloud Zuul--服务网关
- excel对比两顺序不同的表格
- 密钥管理——密钥生命周期管理
- window.print();去除页眉页脚及网址。
- JavaScript实现贪吃蛇小游戏
- java 音频播放器_JAVA音频播放器问题
- 打开Excel新窗口的方法
- 获取月份的第一天和最后一天