①初识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主要用途

  1. Web应用

    • Web应用,说简单点就是通过浏览器(广义,APP也是浏览器)访问的应用,是当前Java最主流的用途
    • 普遍来说Web应用无法单机使用,需要浏览器配合服务器端才能使用
    • Java是最主流的服务器端语言
  2. Android开发

    • 安卓开发已经逐渐式微,越来越少人使用Java开发Android
    • Kotlin
    • HTML5、Vue
  3. 桌面应用开发

    • 桌面应用,不需要浏览器,直接运行在桌面操作系统上的应用
    • 普遍来说,桌面应用开发是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下面
      • 目录路径上要体现上下级
    • 总之,目录路径要体现模块之间的关系
  • 点击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文件
      • 包用来区分访问权限
    • 包的命名,以反转公司域名为规范
    • 包名应该全部小写
    • 多级包名以点(.)分隔
  • 类、接口等命名标识符
    • 大驼峰命名法
  • 变量、方法的命名标识符
    • 小驼峰命名法
  • 常量的命名标识符
    • 全部大写(建议)
    • 多个单词之间用下划线(_)隔开

为了方便大家后续看代码,我会给包名加序号表示我们上课的顺序,但是大家开发中不要这么做

给人起名字也追求好听吉祥,标识符起名也有自己的追求

  • 核心追求是“见名知意”,应该赋予标识符一个有意义、有用途的名字

  • 标识符的命名规范,可以从源码、大神的代码中学习,也是一个逐渐积累的过程

课堂抽奖

以下哪些标识符的命名规则符合规范

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个字节

注意: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相关推荐

  1. Java学习路线图,如何学习Java事半功倍?

    作为一个初学者想掌握Java并不是很容易,Java本身是具有一定难度的,虽然说兴趣这东西可以让我们学习不累,但是有多少人学习是因为兴趣,或者有多少人知道自己的兴趣在哪?所以我很明确的告诉你学习这事本来 ...

  2. Java学习必不可少的网站,快收藏起来

    java技术在IT互联网行业的发展前景一直在提升,越来越多的人都在学习java技术,今天小编来给大家提供一些学习Java的网站集合,希望能够帮助到正在学习java技术的同学. Java学习必不可少的网 ...

  3. 分享五款java学习辅助工具,总有你用的上的~

    想要学好java技术,除了自身的努力,辅助工具也不缺少,辅助工具可以帮助大家在今后的工作中可以提高工作效率,下面小编就来分享五款java学习辅助工具,总有你用的上的~ 五款java学习辅助工具: 1. ...

  4. Java学习从入门到精通的学习建议

    想要学好java技术,首先打好基础很重要,不论学什么基础都是重中之重,学习Java更是如此.如:基础语法.核心类库.面向对象编程.异常.集合.IO流等基础如果学不好,那么后边更深入的语法也不容易学会. ...

  5. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  6. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  7. JAVA学习资源网站

    中文java技术网--http://www.cn-java.com/ 灰狐动力(http://www.huihoo.com/)-- 该站点有许多的开源的项目的介绍和学习,涉及操作系统,数据库等许多方向 ...

  8. 我的WEB之路(一)-2.JAVA学习路线

    第一阶段:针对性夯实JAVA基础 课程名称 核心要点 完成目标 Java基础入门 搭建Java开发和运行环境等,IDE工具的学习和使用,Java语言基础,数据类型,运算符,条件和循环,数组使用等,Ja ...

  9. 准备写java学习笔记

    准备写java学习笔记 java int 转载于:https://blog.51cto.com/cryingcloud/1975267

最新文章

  1. 【总结】sqli-labs Less(1-35) 小结
  2. BZOJ1058 [ZJOI2007]报表统计 set
  3. python访问多个网站_Python多并发访问网站
  4. 内存溢出原因及解决方案
  5. vsftpd配置文件详解 ---配置解说
  6. 学习工作即游戏:游戏化生存的现实物语
  7. ReactNative 告别CodePush,自建热更新版本升级环境
  8. 【TensorFlow】学习资源汇总以及知识总结
  9. CTO职场解惑指南系列(一)
  10. 特斯拉回应Model 3新车无USB接口:芯片短缺
  11. 程序人生001--点滴感悟-随笔01
  12. SQLi LABS Less 10 时间盲注
  13. Spring Cloud Zuul--服务网关
  14. excel对比两顺序不同的表格
  15. 密钥管理——密钥生命周期管理
  16. window.print();去除页眉页脚及网址。
  17. JavaScript实现贪吃蛇小游戏
  18. java 音频播放器_JAVA音频播放器问题
  19. 打开Excel新窗口的方法
  20. 获取月份的第一天和最后一天

热门文章

  1. php 腾讯云 文字识别_讯飞语音转文字,图片转文字,效率高还免费
  2. 财务计算——财务计算——财务计算
  3. react实现echarts的疫情地图
  4. 价格数字转换成大写汉字的一个类
  5. 安卓Android手机直播推送同步录像功能设计与实现源码
  6. 教务系统爬虫收集学生成绩信息
  7. 由网易云音乐跑步FM功能引申出的一些产品设计思路相关的粗浅看法
  8. Linux就这个范儿 第14章 身在江湖
  9. Word2019如何取消保存文件位置默认为Onedrive-个人——文档
  10. codeforces 702F 可持久化平衡树