推荐书籍
为何学习 Java 基础
- Java 基础是学习Java EE、大数据、Android开发的基石
- Java EE
- 大数据
- Android 开发
1、Java 编程语言核心结构
Java基础知识图解
计算机语言:人与计算机交流的方式
种类:
第一类语言:机器语言。指令以二级制代码形式存在。
第二类语言:汇编语言。使用助记符表示一条机器指令。
第三代语言:高级语言
- C、Pascal、Fortran 面向过程的语言
- C++ 面向过程/面向对象
- Java 跨平台的纯面向对象语言(现阶段市场需求最多)
- .Net 跨语言的平台
- Python、Scala等等
1.1、Java 语言概述
概述:
- 由Sun 公司1995年推出的一门高级编程语言
- 是一种面向Internet 的编程语言
- 随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言
- 后台开发使用的语言:Java、PHP、Python、Go、Node.js
Java 在各领域的应用
- 企业级应用:主要指复杂的大企业软件系统、各种类型的网站。优势:安全机制及跨平台,应用领域包括:金融、电信、交通、电子商务等;
- Android 平台应用:Android应用程序使用Java语言编写;
- 大数据平台开发:各类框架有Hadoop, spark, storm, flink等,就这类技术生态圈来讲,还有各种中间件如flume, kafka, sqoop等等 ,这些框架以及工具大多数是用Java 编写而成
- 移动领域应用:主要表现在消费和嵌入式领域,例如:手机、 PDA、机顶盒、汽车通信设备等
Java语言的诞生
- James Gosling 团队开发“Green” 项目是,发现 C 缺少垃圾回收系统,可移植的安全性、分布式程序设计和多线程功能
- Java 语言的变量声明,操作符形式,参数传递,流程控制等方面和 C、C++ 语言完全相同,继承了C++ 语言面向对象技术的核心,舍弃了C语言中容易引起错误的指针(使用引用来取代)、运算符重载、多重继承(使用接口取代),增加了垃圾回收器功能。
- JDK 1.5引入泛型编程、类型安全的枚举、不定长参数和自动装箱/拆箱
主要特性
- Java语言是强制面向对象的,支持类之间的单继承,支持接口之间的多继承;
- Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口;
- Java语言是健壮的。 Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证;
- Java语言是安全的。 Java通常被用在网络环境中,为此, Java提供了一个安全机制以防恶意代码的攻击。如:安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查;
- Java语言是体系结构中立的。 Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行;
1.2、Java语言运行机制及运行过程
Java 语言特点
特点一: 面向对象
- 两个基本概念:类、对象
- 三大特性:封装、继承、多态
特点二: 健壮性
- 吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
特点三: 跨平台性
- 跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。 “Write once , Run Anywhere”
- 原理:只要在需要运行 Java 应用程序的操作系统上,先安装一个Java虚拟机 (JVM Java
Virtual Machine) 即可。由 JVM 来负责 Java 程序在该系统中的运行。
两种核心机制:
- Java 虚拟机
- JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。
- 对于不同的平台,有不同的虚拟机
- 只有某平台提供了对应的java虚拟机, java程序才可在此平台运行
- Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”
- Java 虚拟机所处的位置
- 垃圾回收机制
- 对不再使用的内存空间进行回收—— 垃圾回收,在C/C++ 等语言中,由程序员负责回收无用内存,java 语言消除了程序员回收无用内存空间的责任:它提供一种系统级线程 跟踪存储空间的分配方案,并在JVM空闲时,检查并释放那些可被释放的存储空间。
- 垃圾回收在 Java 程序运行过程中自动进行,程序员无法精确控制和干预
- Action:Java程序还会出现内存泄漏和内存溢出问题吗? 是的
1.3、环境搭建
1、什么是JDK, JRE
- JDK(Java Development Kit Java开发工具包)JDK 是提供给 Java 开发人员使用的,其中包含了java的开发工具,也包括了 JRE。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等
- JRE(Java Runtime Environment Java运行环境) 包括Java虚拟机和 Java 程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
- 总结:使用JDK的开发工具完成的java程序,然后交给JRE去运行
- JDK = JRE + 开发工具集(例如Javac编译工具等)
- JRE = JVM + Java SE标准类库
2、配置环境变量 path - 可以参考网上资料
3、开发HelloWord程序
public class Test{ // 程序执行的入口 public static void main(String[] args) { System.out.println(“Hello World!”); } }
1.4、基本语法
1、文档注释(Java 特有)
/** * @author 指定java程序的作者 * @version 指定源文件的版本 */
注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现该程序的说明文档
操作方式
javadoc -d mydoc -author -version HelloWorld.java
2、基本语法
- Java 源文件以“java”为扩展名。源文件的基本组成部分是类(class)
- Java 应用程序的执行入口是main()方法。它有固定的书写格式:
- public static void main(String[] args) {…}
- Java 语言严格区分大小写。
- Java 方法由一条条语句构成,每个语句以“;”结束。
- 大括号都是成对出现的, 缺一不可。
- 一个源文件中最多只能有一个 public 类。其它类的个数不限,如果源文件包含一个public类,则文件名必须按该类名命名
3、良好的编程风格
正确的注释和注释风格
- 使用文档注释来注释整个类或整个方法。
- 如果注释方法中的某一个步骤,使用单行或多行注释。
正确的缩进和空白
- 使用一次tab操作,实现缩进
- 运算符两边习惯性各加一个空格。比如: 2 + 4 * 5。
块的风格
- Java API 源代码选择了行尾风格
public class Test { public static void main(String[] args){ System.out.println("Block Style!"); } }
4、常用的Java开发工具
文本编辑工具
- 记事本
- UltraEdit
- EditPlus
- TextPad
- NotePad
- Sublime
Java 集成开发环境(IDE)
- JBuilder
- NetBeans
- Eclipse
- MyEclipse
- IntelliJ IDEA(目前Java开发效率最快的IDE工具)
2、变量与运算符
2.1、关键字与保留字
关键字(keyword)的定义和特点:
定义: 被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
特点: 关键字中所有字母都为小写
- 用于定义数据类型的关键字
class interface enum byte short
int long float double char boolean void
- 用于定义流程控制的关键字
if else switch case default
while do for break continue return
- 用于定义访问权限修饰符的关键字
private protected public
- 用于定义类,函数,变量修饰符的关键字
abstract final static synchronized
- 用于定义类与类之间关系的关键字
extends implements
- 用于定义建立实例及引用实例,判断实例的关键字
new this super instanceof
- 用于异常处理的关键字
try catch finally throw throws
- 用于包的关键字
package import
- 其他修饰符关键字
native strictfp transient volatile assert
- 用于定义数据类型值的字面值
true false null
保留字:现有Java版本尚未使用, 但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字。
goto 、 const
2.2、标识符(Identifier)
标识符定义:Java 对各种变量、 方法和类等要素命名时使用的字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符
- 由26个英文字母大小写,0~9,_或$组成,数字不可以开头,严格区分大小写,不能包含空格
名称命名规范
- 包名:多单词组成时,所有字母都小写:xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZxx
- 变量名、方法名:多单词时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
- 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
- 注意:标识符可以使用汉字声明,但是不建议使用
2.3、变量
变量的概念:
- 内存中的一个存储区域
- 该区域的数据可以在同一类型范围内不断变化
- 变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值
变量的作用:用于在内存中保存数据
使用变量注意事项:
- Java中每个变量必须先声明,后使用
- 使用变量名来访问这块区域的数据
- 变量的作用域:其定义所在的一对{ }内
- 变量只有在其作用域内才有效
- 同一个作用域内,不能定义重名的变量
声明和赋值变量
- 语法: <数据类型> <变量名> = <初始化值>
- 例如: int var = 10;
变量分类-按数据类型
- 基本数据类型
- 数值型 整数(byte,short,int,long) 浮点类型(float,double)
- Java各整数类型有固定的表数范围和字段长度(bit 计算机中的最小存储单位 byte计算机中基本存储单元)
- byte 1字节(8bit) -128~127
- short 2字节 -2^15 ~ 2^15 -1
- int 4字节 -2^31 ~2^31 -1
- long 8字节 -2^63 ~2^63 -1
- 浮点类型
- float:单精度,尾数可以精确到7位有效数字 4字节
- double:双精度,精度是float的两倍 8字节
- 字符型 char
- 字符常量是用单引号(‘ ’)括起来的单个字符
- 还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量
- UTF-8 是一种变长的编码方式,在互联网上使用最广的一种 Unicode 的实现方式
- 布尔类型 boolean
- 用来判断逻辑条件
- if条件控制语句;
- while循环控制语句;
- do-while循环控制语句;
- for循环控制语句;
- boolean类型数据只允许取值true和false,无null。
- java虚拟机没有任何供 boolean值专用的字节码指令,在编译之后都是用 int数据类型来代替:true用1表示,false用0表示 《java虚拟机规范 8版》
- 自动类型转换:容量小的类型自动转换为容量大的数据类型
- byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型
- boolean类型不能与其它数据类型运算
- 任何基本数据类型的值和字符串(String)进行连接运算时(+), 基本数据类型的值将自动转化为字符串(String)类型
- 引用数据类型
- 类 Class 包含字符串
- String不是基本数据类型,属于引用数据类型
- 强制类型转换 :将容量大的数据类型转换为容量小的数据类型。 使用时要加上强制转换符: (),可能造成精度降低或溢出
- 字符串不能直接转换为基本类型,可以通过基本类型对应的包装类型来转换
- 如: String a = “43”; int i = Integer.parseInt(a);
- boolean类型不可以转换为其它的数据类型
- 进制:所有数字在计算机底层都以二进制形式存在。(计算机组成原理课程)
- 计算机以二进制补码的形式保存所有的整数
- 正数的原码、反码、补码都相同
- 负数的补码是其反码+1
- 目的:简化计算机的基础电路设计,让机器只有加法,没有减法
- 接口 interface
- 数组 [ ]
变量分类-按声明的位置不同来区划
- 在方法体外,类体内声明的变量称为成员变量。
- 实例变量(不加 static 修饰)
- 类变量(以 static 修饰)
- 在方法体内部声明的变量称为局部变量
- 形参(方法、构造器中定义的变量)
- 方法局部变量(在方法内定义)
- 代码块局部变量(在代码块内定义)
除了局部变量形参外,其他类型需显式初始化
2.4、运算符
定义:运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符
- 算术运算符的注意问题
- 如果对负数取模,可以把模数负号忽略不记,如: 5%-2=1。 但被模数是负数则不可忽略
- 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分
- +”除字符串相加功能外,还能把非字符串转换成字符串
- System.out.println(“5+5=”+5+5); //打印结果是? 5+5=55
赋值运算符
- 符号: =
- 当“=”两侧数据类型不一致时, 可以使用自动类型转换或使用强制类型转换原则进行处理。
- 支持连续赋值
比较运算符(关系运算符)
逻辑运算符
- &—逻辑与 | —逻辑或 ! —逻辑非
- && —短路与 || —短路或 ^ —逻辑异或
- 逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6
位运算符
- 位运算是直接对整数的二进制进行的运算
- 使用场景?
三元运算符 - (条件表达式)?表达式1:表达式2;为true, 运算后的结果是表达式1;
- 表达式1和表达式2为同种类型
- 运算符的优先级
2.5、程序流程控制
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块
三种基本流程结构
顺序结构
- 程序从上到下逐行地执行,中间没有任何判断和跳转
分支结构
- 根据条件,选择性地执行某段代码。条件表达式必须是布尔表达式、布尔变量
- 有if…else和switch-case两种分支语句
- 语句块只有一条执行语句时,一对{}可以省略,但建议保留
- 当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓;当多个条件是“包含”关系时,“小上大下 / 子上父下
- switch语句有关规则
- switch(表达式)中表达式的值必须是下述几种类型之一: byte, short,char, int, 枚举 (jdk 5.0), String (jdk 7.0)
- case子句中的值必须是常量
- if 和 switch语句很像,具体什么场景下,应用哪个语句呢?
- 如果判断的具体数值不多,而且符合byte、 short 、 char、 int、 String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高
- 对区间判断,对结果为boolean类型判断,使用if, if的使用范围更广。也就是说, 使用switch-case的,都可以改写为if-else
循环结构
- 根据循环条件,重复性的执行某段代码。
- 有while、 do…while、 for三种循环语句。
- for循环
- for (①初始化部分; ②循环条件部分; ④迭代部分){
③循环体部分;
} - 执行过程:①-②-③-④-②-③-④-②-③-④-…-②
- ②循环条件部分为boolean类型表达式,当值为false时,退出循环
- ④可以有多个变量更新,用逗号分隔
- while循环
- ①初始化部分
while(②循环条件部分){
③循环体部分;
④迭代部分;
} - 执行过程:①-②-③-④-②-③-④-②-③-④-…-②
- for循环和while循环可以相互转换
- do-while循环
- 语法格式
①初始化部分;
do{
③循环体部分
④迭代部分
}while(②循环条件部分); - ①-③-④-②-③-④-②-③-④-…②
- 特殊关键字的使用:break、 continue
- break语句用于终止某个语句块的执行
- break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
- continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环
- return:并非专门用于结束循环的,它的功能是结束一个方法,不管这个return处于多少层循环之内
- 注: JDK1.5提供了foreach循环,方便的遍历集合、数组元素
3、数组
定义:是多个相同类型数据按一定顺序排列的集合, 并使用一个名字命名, 并通过编号的方式对这些数据进行统一管理
3.1、概述
1、数组本身是引用数据类型,数组中的元素可以是任何数据类型;
2、创建数组对象会在内存中开辟一整块连续的空间,数组名中的引用时这块连续空间的首地址;
3、数组的长度一旦确定,就不能修改
一维数组的使用:声明
type var[] 或 type[] var;
- 例如:int a[];int[] a1;double b[];String[] c; //引用类型变量数组
- Java语言中声明数组时不能指定其长度