java学习 day01_basic

①初识Java

文章目录

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 基本数值类型的取值范围
基本数据类型字节长度大小(位)最小值最大值取值范围
byte1字节8bit-2^72^7-1-128 ~ 127
short2字节16bit-2^152^15-1-32768 ~ 32767
int4字节32bit-2^312^31-1-2147483648 ~ 2147483647(21亿出头)
long8字节64bit-2^632^63-1-9223372036854774808 ~ 9223372036854774807(大概922亿亿)
float4字节32bit---3.403E383.404E38(有效位数78位)
double8字节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'); //a
    System.out.println('a'+1); //98
    System.out.println("hello"+'a'+1); //字符串等级最高,拼接,helloa1
    System.out.println('a'+1+"hello");//98hello
    System.out.println("5+5"+5+5);//5+5=55
    System.out.println(5+5+"=5+5");//10=5+5
    System.out.println(5 + 5.0);// 10.0
    System.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值控制字符
0NUT32(space)64@96
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92/124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL

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
++自增:操作数的值增加1a++一次是11
自减:操作数的值减少1a–一次是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
<<按位左移运算符。左操作数按位左移右操作数指定的位数。在一定范围内,每左移一位,相当于乘以2a << 2得到240,即 1111 0000
>>按位右移运算符。左操作数按位右移右操作数指定的位数。在一定范围内,每右移一位,相当于除以2a >> 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
\ddd1到3位八进制数所代表的任意字符Unicode编码前256个字符
\0空字符,什么都没有000
\uxxxx4位十六进制所代表的任意字符Unicode编码前65536个字符
\u0000空字符,什么都没有000
  • 需要特殊强调的是:

    • \ddd,它的取值范围为 \0 ~ \377,十进制就是0~255
    • \uxxxx,它的取值范围为\u0000 ~ \uFFFF,十进制就是0~65535
    • 标注加重颜色的,较为常用,其它的了解即可
  • 反斜杠(\)和斜杠(/)不要混淆了

    • 反斜杠(\)是计算机出现了之后发明的专用符号,生活中几乎不应该使用反斜杠
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值