1. 环境搭建与语法入门
1.1 Java初识
-
Java初识:
Java发展史:Java是一门面向对象的程序设计语言,1995年由sun公司发布,期初是咖啡的名字,2010年sun公司被 Oracle公司收购
目前主流JDK版本是1.8
-
JVM
JVM( Java Virtual Machine),Java虚拟机
JVM是Java平台无关性实现的关键
-
Java程序执行过程
-
源文件.java 编译器编译成为.class文件通过解释器呈现出来
-
JDK
JDK( Java Development Kit),Java语言的软件开发工具包。
两个主要组件
Javac-编译器,将源程序转成字节码
java-运行编译后的java程序( class后缀的)
-
JRE
JRE(Java Runtime environment)包括Java虚拟机(JVM)、Java核心类库和支持文件
如果只需要运行Java程序,下载并安装JRE即可
如果要开发Java软件,需要下载JDK
在JDK中附带有JRE
-
JDK、JRE和JVM三者的关系
JRE=JVM+ JavaSE标准类库
JDK=JRE+开发工具集(例如avac编译工具等)
JDK > JRE >JVM -
Java平台
Java Se 桌面程序 Java标准版
Java ee Web程序 Java企业版
Java me 移动设备 Java微型版
1.2 JDK的环境搭建
-
Window版JDK的下载和安装
- 下载链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- 配置环境变量1:我的电脑-属性-高级系统设置-环境变量-用户变量Path-编辑-新建-编辑-复制jdk/bin目录
- 配置环境变量2:我的电脑-属性-高级系统设置-环境变量- 用户变量-新建用户变量-
- 变量名:JAVA_HOME
- 变量值:JAVA根目录
- 编辑环境变量:%JAVA_HOME%/bin
(用户变量只对当前用户,系统变量针对所有用户)
-
Mac版的JDK的下载和安装
- 下载链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- 配置环境变量:编辑命令 vi .bash_profile
- jdk/bin目录:$PATH
- source .bash_profile
-
编写第一个程序:HelloWorld
public Class HelloWorld{
public static void main(String[] args)
System.out.println("HelloWorld")
}
1.3 Java常量与变量
- 标识符
- 双引号引起来的是字符串,其他是标识符
- 标识符的命名规则
标识符可以由字母、数字、下划线()和美元符($)组成,不能以数字开头
标识符严格区分大小写
标识符不能是Java关键字和保留字
标识符的命名最好能反映出其作用
- 关键字
- while for …
- 保留字 goto
- 变量
- 什么是变量
- 变量的三个元素:变量类型、变量名和变量值。
- 变量名的命名规则
- 满足标识符命名规则
符合驼峰法命名规范
尽量简单,做到见名知意
变量名的长度没有限制 - 类的命名规则
- 满足 Pascal命名法规范
- 什么是变量
- 数据类型
- 基本数据类型
- 数值型
- 整数型 byte short int long
- 浮点型 float double
- 字符型 char
- 布尔型 boolean
- 数值型
- 引用数据类型
- 类class 接口 interface 数组 array - 变量声明
- 格式:数据类型 变量名;
int age ;声明整数变量名age - 赋值
- 使用“=”运算符进行赋值
′=″叫作赋值运算符,将运算符右边的值赋给左边的变量。
int age 定义int 型变量age
age =3 将3赋值给age-
变量的初始化
- 在定义变量的同时给变量赋值,即变量的初始化
- int age =3; -
浮点型字面值
浮点型字面值默认情况下表示 double类型,也可以在值后加d或D
-
- 基本数据类型变量的存储
数据类型分为基本数据类型和引用数据类型
引用数据类型包括数组和类等
类定义的变量又叫对象 - 按照作用范围分为:
类级、对象实例级、方法级、块级 - Java内存中细分: 栈 堆 常量池
- 栈:主方法定义的局部变量是在栈
- int n =100 存储方式:首先在 栈中开辟int大小的 - 字符型字面值
字符型字面值用单引号内的单个字符表示。 - ASCI码
ASCII( American Standard Code for Information Interchange,美国标准信息交换代码)基于拉丁字母的一套电脑编码系统主要用于显示现代英语和其他西欧语言
ASCI码表示
使用7或8位二进制数组合来表示128或256种可能的字符
7位二进制数组合—标准ASCI码
8位二进制数组合(后128位)—扩展ASCI码 - Unicode编码
Unicode编码又称为统一码、万国码
char c=u005d′;
Unicode表示法,在值前加前缀u - 布尔类型字面值
布尔值只能定义为true和 false
例: boolean b=true; - 字符串字面值
双引号引起来的0个或多个字符
String s=“ ”;
- 基本数据类型
- 类型转换
- 类型转换分为自动类型转换和强制类型转换
- 自动类型转换:由大到小自动转换
- 强制类型转换
- 如果A类型的数据表示范围比B类型大,则将A类型的值赋值给B类型,需要强制类型转换
- 强制数据类型转换的格式:(数据类型)数值
- 常量
- 不能变化的量, final int n=5
- 常亮的规则一般用大写表示:PI
1.3 Java运算符
- 表达式:表达式由运算符和操作数组成
- 运算符
- 算术运算符
- 加法 5+10=15
- 减法10-5=5
- 乘法3*6=18
- 除法36/4=9
- %求余数 13%3=1
- 自增1 Int n=3: n++
- 自减1 int n=4:–n- 赋值运算符
- 格式:变量=表达式;
例:int n =3;/将3赋值给变量n
注意:赋值运算符是从右往左运算! - 关系运算符
- 比较运算符用于判断两个数据的大小,如大于比较的结果是一个布尔值
- 大于 >
- 小于 <
- 大于等于 >=
- 小于等于 <=
- 等于 ==
- 不等于 != - 逻辑运算符
- 与 &&或&
- 或 ||或 |
- 非 ! - 条件运算符
- if(条件){<代码块>}
- if(条件){<代码块>}else {<语句块>}
- Java中的条件运算符是三目运算符
语法:布尔表达式? 表达式1:表达式2
当布尔表达式的值为true,则返回表达式1的值,否则返回表达式2的值
- 位运算符
- 赋值运算符
1.4 Java选择结构
流程控制语句 :
- 顺序结构: 顺序结构,从上往下依次执行
- 选择结构: 选择结构,根据条件执行对应的内容
- if结构
- if(条件) 语句1}else 语句2
- if(条件){ 语句1;else {语句2;}
- 嵌套if - switch结构
- if结构:
- 判断条件是布尔类型
判断条件是一个范围- switch结构
- 判断条件是常量值
- switch结构
- if结构
- 循环结构
- while循环
- while(循环条件)
{
语句}`
- while(循环条件)
- do- while循环
- 注意事项
do- while循环至少执行一次
循环条件后的分号不能丢 - do{
语句;
} While(循环条件);
- 注意事项
- for循环
- 语法格式
for(表达式1表达式2;表达式3)
{语句}
- 语法格式
- 循环嵌套
- While(循环条件){(…循环条件)}
- break语句
- break语句可以结束当前循环的执行
执行完 break语句后,循环体中位于 break语句后面的语句就不会被执行
注意: break语句是跳出当前循环
- break语句可以结束当前循环的执行
- continue语句
- continue语句只能用在循环里
- continue语句可以结束当前循环的执行,但是要继续下一次循环的执行
- ebug入门
- 调试的作用:让程序员能看清程序每一步的效果,在需要査看结果的时候,使用 debug查看实际结果是否与预期结果一致。
- while循环
2. Java语法之循环、数组与方法
2.1数组
- 数组:是相同类型的数据按顺序组成的一种引用数据类型
- 一维数组
- 数组声明:语法格式: 数据类型[] 数组名;
- 数组创建
- 语法格式一:先声明后创建
数据类型数组名;
数组名=new数据类型[数组长度] - 语法格式二:声明的同时创建数组
数据类型数组名=neW数据类型[数组长度]
- 语法格式一:先声明后创建
- 数组在内存中的存储:数组会被分配连续的内存空间
- 数组的初始化:声明数组的同时给数组赋值,叫做数组的初始化。
- 数组元素的引用
语法格式:
数组名[下标]; 注意:下标从0开始 - 数组的长度:属性 length表示数组的长度
- 增强型for循环又叫 foreach循环
- 二维数组
- 二维数组的声明和创建
- 二维数组的初始化
- 二维数组的引用
2.2 Java方法
-
方法的声明和调用
- 方法声明
语法格式 访问修饰符 返回类型 方法名(参数列表) {方法体} - 方法分类
- 根据方法是否带参数、是否返回值,可分为四类:
无参无返回值方法
无参带返回值方法
带参无返回值方法
带参带返回值方法
- 根据方法是否带参数、是否返回值,可分为四类:
- 方法声明
-
方法的重载
- 方法名相同,参数列表不同
-
可变参数列表:
可变参数一定是方法中的最后一个参数
数组可以传递给可变参数的方法,反之不行
在重载中,含有可变参数的方法是最后被选中的 -
方法的传值问题
基本数据类型传值
方法中对参数的修改,不会对主方法中传来的变量值产生影响引用数据类型传值
方法中对数组的改变,会影响主方法中传来的数组
3. 面向对象之封装、继承与多态
3.1 类和对象
什么是对象: 万物皆对象
- 什么是面向对象
- 人关注对象
- 人关注事物信息 - 什么是类
- 类是模子,确定对象将会拥有的特征(属性)和行为(方法)
- 对象是类的实例表现
- 对象是特定类型数据 - 属性和方法
- 属性:对象具有的各种静态特征 对象有什么”
- 方法:对象具有的各种动态行为 -"对象能做什么” - 类和对象的关系
- 类
- 抽象的概念
- 模板
- 对象:一个看得到、摸得着的具体实体。
3.2 创建类
类-----实例化-----完成具体程序
3.3 new关键字:实例化对象
- 类
- 实例化对象的过程可以分为两部分
- 声明对象 Cat one 进栈 存放局部变量
- 实例化对象 new Cat() 堆 存放动态数据 - 构造方法
- 1、构造方法与类同名且没有返回值
2、构造方法的语句格式
3、只能在对象实例化的时候调用
4、当没有指定构造方法时,系统会自动添加无参的构造方法
5、当有指定构造方法,无论是有参、无参的构造方法,都不会自动添加无参的构造方法
6、一个类中可以有多个构造方法
3.2 封装
- 概念:
将类的某些信息隐藏在类内部,不允许外部程序直接访问
通过该类提供的方法来实现对隐藏信息的操作和访问
隐藏对象的信息 - 特点
1、只能通过规定的方法访问数据
2、隐藏类的实例细节,方便修改和实现 - 实现步骤:
- 修改属性的可见性 : 设为 private
创建 getter/ setter方法 : 设为 private用于属性的读写
在 getter/ setter方法中 加入属性控制语句:对属性值的合法性进行判断
3.3 继承
- 概念
- 1、一种类与类之间的关系
2、使用已存在的类的定义作为基础建立新类
3、新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类
4、满足“ A is a b″的关系
- 1、一种类与类之间的关系
- 语法
- 1、使用 extends实现封装
2、单一继承,只能有一个父类
- 1、使用 extends实现封装
- 种类与类之间的关系
使用已存在的类的定义作为基础建立新类
新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类 - 特点
1、利于代码复用
2、缩短开发周期 - 继承的关系
满足“ A is a b”的关系就可以形成继承关系 - 方法的重写
- 方法重载:
1、同一个类中
2、方法名相同,参数列表不同(参数顺序、个数、类型)
3、方法返回值、访问修饰符任意
4、与方法的参数名无关
方法重写
1、有继承关系的子类中
2、方法名相同,参数列表相同(参数顺序、个数、类型)
3、访问修饰符,访问范围需要大于等于父类的访问范围
4、与方法的参数名无关
- 方法重载:
- super
子类的构造的过程中必须调用其父类的构造方法
如果子类的构造方法中没有显式标注,则系统系默认调用父类无参的构造方法
如果子类构造方法中既没有显式标注,且父类中没有无参的构造方法,则编译出错
使用 super调用父类指定构造方法,必须在子类的构造方法的第一行
3.4 继承的应用 - Object类
- 概念:
- Object类是所有类的父类
- 一个类没有使用 extends关键字明确标识继承关系,则默认继承 Object类(包括数组)
- Java中的每个类都可以使用 Object中定义的方法
- equals()
- tostring()
- 概念:
- fina关键字的使用
- 修饰类表示不允许被继承 修饰方法表示不允许被子类重写
- fina修饰的方法可以被继承 不能修饰构造方法
- 修饰变量表示不允许修改
- 方法内部的局部变量 在使用之前被初始化赋值即可
类中成员变量 只能在定义时、构造方法、构造代码块中进行
- 可配合 static使用
- 使用fial修饰可以提高性能,但会降低可扩展性 - 注解简介
- JDK1.5版本引入的一个特性
可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释 - 按照运行机制分
- 源码注解: 注解只在源码阶段保留 在编译阶段会被丢弃 @overide
- 编译时注解 注解会在编译时期保留在加载cass文件时会被丢弃 @ Notnull
- 运行时注解 在运行阶段还起作用,甚至会影响运行逻辑的注解。 @ Autowide
- 按照来源分
- 来自JDK的注解
- 来自第三方的注解
- 我们自己定义的注解
- 元注解 @Target
- JDK1.5版本引入的一个特性
3.4 多态
多态的概念:意味着允许不同类的对象对同一消息做出不同的响应。
- 编译时多态:设计时多态方法重载
- 运行时多态:程序运行时动态决定调佣那个方法
- 必要条件:
满足继承关系
父类引用指向子类对象
- 必要条件:
- 类型转换
- 向上转型
- 向上转型、隐式转型、自动转型
父类引用指向子类实例,可以调用子类重写父类的方法以及父派生的方法,无法调用子类独有方法
小类转型为大类
- 向上转型、隐式转型、自动转型
- 向下转型
- 向下转型、强制类型转换
子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法
必须满足转型条件才能进行强转
- 向下转型、强制类型转换
- 通过 instance运算符,来解决引用对象的类型,避免类型转换的安全性问题,提高代码的强壮性。
抽象类
- 向上转型
- 应用场景
某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。 - 抽象类&抽象方法
使用规则
1、 abstract定义抽象类
2、抽象类不能直接实例化,只能被继承,可以通过向上转型完成对象实例
3、abstract定义抽象方法,不需要具体实现
4、包含抽象方法的类是抽象类
3.5单例模式
单利模式定义和作用
- 单例模式优点:
1、在内存中只有一个对象,节省内存空间
2、避免频繁的创建销毁对象,提高性能
3、避免对共享资源的多重占用 - 缺点:
1、扩展比较困难
2、如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失 - 使用场景:
1、创建对象时占用资源过多,但同时又需要用到该类对象
2、对系统内资源要求统一读写,如读写配置信息
3、当多个实例存在可能引起程序逻辑错误,如号码生成器 - 目的: 使得类的一个对象成为该类系统中的唯一实例
- 定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供
- 要点:
1、某个类只能有一个实例
2、必须自行创建实例
3、必须自行向整个系统提供这个实例 - 实现
1、只提供私有的构造方法
2、含有一个该类的静态私有对象
3、提供一个静态的公有方法用 于创建、获取静态私有对象 - 单例模式代码实现方案:
- 饿汉式:对象创建过程中实例化 空间换时间
- 懒汉式:静态公有方法中实例化 时间换空间
3.6 接口
概念:
- 接口定义了某一批类所需要遵守的规范
接口不关心这些类的内部数据,也不关心这些类里方法
的实现细节,它只规定这些类里必须提供某些方法。
语法: - [修饰符] interface接口名[ extends父接口1父接口2
零个到多个常量定义
零个到多个抽象方法的定义
零个到多个默认方法的定义(jdk18新增)
零个到多个静态方法方法的定义…(jdk18新增)
用法: - 接口中抽象方法可以不写 abstract关键字
访问修饰符默认 public
当类实现接口时,需要去实现接口中的所有抽象方法,否则需要将该类设置为抽象类
3.7 内部类
概念:
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类与之对应,包含内部类的类被称为外部类
与之对应,包含内部类的类被称为外部类
- 内部类的分类
成员内部类
静态内部类
方法内部类
匿名内部类