Java从入门到精通
2023-06-10 00:44:31 0 举报
AI智能生成
Java流程图总结
作者其他创作
大纲/内容
初识Java
Java简介
Java是一门高级的面向对象的程序设计语言
什么是Java语言
1995年由Sun公司推出的一门面向对象得程序语言,是一种通过解释方式来执行得语言
Java的应用领域
桌面应用系统开发
嵌入式系统开发
电子商务应用
企业级应用开发
交互式系统开发
多媒体系统开发
.......
Java的版本
java SE
java EE
Java语言的特性
简单
面向对象
分布性
可移植性
解释性
安全性
健壮性
多线程
高性能
动态
搭建Java环境
JDK下载
在windows10系统下搭建JDK环境
解压缩
下载完JDK的zip压缩包后将压缩包中的所有文件解压到计算机硬盘中
配置环境变量
我的第一个Java程序
我们知道有class文件和Java文件
Java程序运行原理
.java的文件进行代码输入,而.class的文件是运行的文件
熟悉Eclipse开发工具
熟悉Eclipse
Eclipse简介
Eclipse基于Java语言编写,所有代码都是开源的,它的平台体系结构是在插件概念的基础上构建的,插件是Eclipse平台的特征之一
使用Eclipse
创建Java项目
创建类文件
编译技巧
System.out.println()可以通过输入syso和按alt+/快捷键完成
将光标移动到Java代码错误的地方可以知道错误的地方和一些修正方法
程序调试
断点
右击代码行数可以设置断点
Java语言基础
Java主类结构
包声明
一个Java程序由若干个类组成,package为包的关键字
声明成员变量和局部变量
通常将类的属性称为类的全局变量(成员变量),将方法中的属性称为局部变量。成员变量在类体中,局部变量在方法体中,都有各自的应用范围
编写主方法
main()是类体中的主方法从{开始}结束
public、static、void,分别是mian()的权限修饰符、静态修饰符、返回值修饰符,必须声明
String[ ] args是一个字符串类型的数组,是main()方法的参数
基本数据结构
整数型
int型
int型变量在内存中占4字节也就是32位,在bit是由0和1来表示,int型是Java整型值的默认数据类型
byte型
和int类型的定义方法一样
short型
和int类型的定义方法一样
long型
long型的取值范围比int大,属于高精度数据类型,所以在赋值时要在整数后加L或小写l定义
浮点型
默认情况下小数都被看作double型,如果想使用float型,则需要在后面添加f或F,double也可以这么表示,但不强制
例题BMI
字符型
char型
存储单个字符,占用16位(两个字节)的内存空间,定义时要用单引号表示,双引号表示的是字符串
Java可以把字符作为整数对待,由于Unicode编码采用无符号编码,可以存储65536个字符,所以Java中的字符几乎可以处理所有国家的语言文字,要得到一个Unicode表上对应的字符,必须使用char型显式转换
例题
转义字符
是一种特殊的字符变量,以\开头,后跟一个或多个字符,具有特殊意义,不同字符原有的意义,故称转义
例题
布尔型
又称逻辑类型,通过关键字Boolean来定义布尔型变量;只有true(真)false(假)两个值; 不能与整数类型进行转换,通常用在流程控制中用作判断
变量和常量
标识符和关键字
标识符
可以简单理解为一个名字,用来标识类名、变量名、方法名、数组名等
由任意顺序的字母、下划线_、美元符号$和数字组成,并且第一个字符不能是数字,标识符不能是Java中的关键字,标识符严格区分大小写
关键字
又称保留字,Java中已经被赋予意义的单词
关键字表
声明变量
就是告诉编译器这个变量的类型,这样编译器才知道要配置多少空间给它,以及它能存放什么样的数据
在程序运行时,空间的值是会变化的,这个空间就叫变量
变量的命名必须是合法的标识符
变量名赋值规则
内存空间里的值就是变量值
可以不赋值,也可以赋初值
声明常量
运行过程中不会被改变的量称为常量,也被称为final变量
常量只能被赋值一次
声明常量时,除了要指定数据类型,还有通过final关键字进行限定
声明常量语法
常量名通常使用大写字母,但不是必须的
当变量被final关键字修饰时,变量就变成常量,必须在定义时就设定初值,否则会产生错误
变量的有效范围
变量被定义后只是暂存在内存中,等到执行到某一个点,该变量就会被释放掉
有效范围是指程序代码能够访问该变量的区域,超出该区域编译时就会报错
根据有效范围分为成员变量和局部变量
成员变量
在类体中所声明的变量,在整个类中都有效
静态变量
在成员变量前面加上关键字static,就被称为静态变量
有效范围可以跨类
除了能在声明它的类内存取,还能直接以“类名.静态变量”的方式在其他类内使用
实例变量
局部变量
在类的方法体中声明的变量,只在当前代码块中有效也就是{与}之间
在类的方法体中声明的变量包括方法的参数
只在当前定义的方法内有效,不能用于其他方法中
生命周期取决于方法
局部变量与成员变量的名字相同,此时成员变量将被隐藏,就是这个成员变量在此方法中暂时失效
例题:把成员变量排解掉的局部变量
运算符
赋值运算符
“=”它是一个二元运算符
功能:将右方的值赋值给左方
算术运算符
进行除法运算时,0不能做除数,系统会抛出异常
例题:使用
自增自减运算符
为单目运算符
作用:增1或减1
操作元之前
先执行加1或减1,在使该变量参与表达式的运算
操作元之后
先执行变量参与的表达式的运算,在加1或减1
比较运算符
属于二元运算符,在变量之间、自变量之间和其他类型之间做比较
运算结果为Boolean型
逻辑运算符
返回类型为布尔类型的表达式
操作元必须是Boolean类型数据,除!是一元运算符,其他都是二元运算符
运算结果图
位运算符
除了“按位与”和“按位或”运算符外,其他只能用于处理整数的操作数,包括byte,short,char,int和long等数据类型,
子主题
三元运算符
运算规则:若条件式的值为ture则整个表达式取值1,否则取值2;
返回值=判断式?结果1:结果2
数据类型转换
低精度向高精度类型转换永远不会溢出,并一定成功
隐式类型转换
系统自动执行
高精度向低精度类型转换会有信息丢失,有可能失败
显式类型转换(强制类型转换)
除Boolean类型的值外,其他类型的值都能进行显式类型转换
代码注释与编码规范
代码注释
单行
//
多行
/* */
文档
/* * */
编码规范
符号都是英文
每个变量单独一行
空格仅提供分隔,不要有太多无用空格
尽量使用有意义的单词
流程控制
复合语句
以整个块区为单位的语句,又称块语句,由{开始}结束
复合语句为局部变量创建了一个作用域,在作用域中某个变量被创建并能够使用,如果在作用域外使用则会发生错误
条件语句
根据不同结果,执行不同语句
if
告诉程序在某个条件成立的情况下执行某段语句,另一种1情况下执行另外的语句
if后面是作为条件的布尔表达式
返回为true,则执行后面的语句
简单判断
流程图表达
返回为false,不执行if条件之后的语句
如果语句只有一条,则可以省略{ },但为了增强程序的可读性不建议省略
可以分为if语句、if......else和if.....eles if的多分支语句
if.......else
条件语句中最常用的一种形式
语法
后面的()中必须是Boolean型的
例题
为真执行if后面的语句
为假执行else中的语句
流程图表达
if......else if
是多分支语句:如果满足满足条件,就进行某种处理,否则如果满足另一种条件则执行另一种处理
例题
流程图表达原理
switch
检测一个变量是否符号某个条件,如果不符合,再用另一个值来检测,以此类推。
语法
表达式的值必须是整型、字符型、字符串型和枚举类型
先计算表达式的值,如果表达式的值与某个case后面的常量相同,则执行这个case后面的语句,直到遇到break为止
如果没有一个常量与表达式的值相同,执行default后面的语句
在同一个switch语句中case的值必须不同
流程图表达
循环语句
while
也叫条件判断语句哦,它的循环方式为利用一个条件来控制是否要继续反复执行这个语句
语法
返回值为真时,执行{}中的语句,执行完{}中的语句后,再次判断表达式的返回值,直到结果为假,退出循环
流程图表达
注意while表达式的括号后不能加;
do......while
与while语句很像,它们之间的区别就是while语句先判断条件是否成立再执行循环体,而do...while语句则先执行一次循环后再判断条件是否成立。
语法
流程图表达
与while语句明显的区别就是do......while语句在结尾处多加了一个;
for
是Java程序设计中最有用的循环语句之一。一个for循环可以用来重复执行某条语句,直到某个条件得到满足。
语法
第一次循环:先执行表达式1,在判断表达式2,如果为真进入循环,然后计算表达式3
流程图表达
第二次循环:计算表达式2如果为真则继续,如果为假则跳出for循环
循环控制
break
跳出当前循环
流程图
循环嵌套情况下break只会跳出包含它的最内层循环结构,也就是只跳出一层循环
continue
跳过本次循环
不是立即跳出循环,而是跳过本次循环,回到循环的条件测试部分,重新开始。
for循环遇到continue后先执行增量部分,while和do...while语句遇到continue则直接回到条件测试部分。
数组
最常见的一种数据结构。是具有相同数据类型的一组数据的集合。在Java中同样将数组看作一个对象,可根据数组的维数将数组分为一维数组,二维数组......
一维数组
实质上是一组相同类型数据的线性集合,当在程序中需要处理一组数据,或者传递一些数据时,可以应用这种类型的数组。
数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量所属的类型。
使用new关键字为数组分配内存时,必须指定数组元素的类型和数字元素的个数,即数组的长度
数组元素类型决定了数组的数据类型,它可以是Java中任意的数据类型,声明数组后我们还不能立即访问它的任何元素,因为声明数组只是给出了数组名字和元素的数据类型,要想使用它还要为它分配内存空间,在位数组分配内存空间时必须指明数组的长度
使用一维数组的一种错误
是数组越界,是比较常见的错误
我们为此有两种解决办法
1.将i<某数,改为 数组名.length,这是数组长度的意思,这样就不会出错
2.使用foreach循环
我们为此有两种解决办法
1.将i<某数,改为 数组名.length,这是数组长度的意思,这样就不会出错
2.使用foreach循环
二维数组
特殊的一维数组
同一维数组一样,二维数组在声明的时候也没有分配内存空间,同样要使用new关键字来分配内存
数组的基本操作
遍历数组
获取数组中的每个元素,通常使用for循环来实现
遍历二维数组要用到双层for循环,通过length可以获取数组的长度
例题
用foreach语句可以更简单
例题
填充替换数组元素
替换所有元素的值
替换指定范围的值
如果指定的索引位置大于或等于要填充的数组长度会报出数组越界异常
对数组进行升序排序
排序算法根据字典排序,因此数字排在字母前面,大写字母排在小写字母前面
复制数组指定长度到新数组
如果新数字的长度大于旧数字的长度,用0来填充
如果复制后的数组小于旧数组的长度,则会从旧数组的第一个元素开始截取至满足新数组的长度
复制数组部分元素
查询数组中的某一元素的索引位置
查询指定范围中的某一元素
要先排序在查询,才能得到准确的值
如果指定范围大于或等于数组长度则会报出异常
数组排序算法
冒泡排序
基本思想:对比相邻的元素如果满足条件就交换,将较小的数移到数组前面较大的数移到数组后面
冒泡算法由双层循环实现,其中外层循环用于控制排序轮数
算法实现
直接选择排序
基本思想:将指定排序位置元素与其他数组元素进行对比,如果满足条件就交换元素
与冒泡排序的区别:不是交换相邻元素,而是把满足条件的元素与指定的排序位置进行交换
算法实例
算法实现
比冒泡排序的交换次数要少,速度快
反转排序
就是第一个数和最后一个数交换,第二个数和倒数第二个数交换,第三个数和倒数第三个数交换,以此类推。就像一面镜子,如果是单数中间那个不会交换
类和对象
面向对象概述
对象
世间万物都是对象;
通常划分为两个部分:动态属性和静态属性
动态属性就是对象可执行的动作
静态属性就是不能动的部分,这个部分被称为属性,任何对象都会具备其自身属性
以面向对象的思想解决实际问题
1、从问题中抽象抽出对象
2、识别对象的属性
3、识别对象的动态行为
4、识别出对象的属性和行为后,这个对象就被定义完成了
类
实质上就是封装对象属性和行为的载体
是对象的设计图
面向对象具有封装性,继承性和多态性的特点
封装
是面向对象编程的核心,将对象的属性和行为封装起来,载体是类
思想:通常对客户隐藏其实现细节
封装保证了类内部数据结构的完整性,使用类的用户不能轻易的直接操作类的数据结构,只能执行类允许公开的数据,避免了外部操作对内部数据的影响,提高了系统的可维护性
封装特性
继承
主要利用特定对象的共有属性
子类可以继承父类所有的属性,子类还可以衍生子类,但最末尾的类依然能继承父类所有的属性
父类和子类存在一种层次关系,一个类在继承中它即可以是其他类的父类,为其他类提供属性和行为,也可以是其他类的子类。例如:三角形是图形类的子类也是等边三角形的父类。
多态
其实就是父类对象应用于子类的特征就是多态
多态就是继承父类的所有但又会有不属于父类也不同于其他子类的属性就相当于它的个性。
类
成员变量
对象的属性也称为成员变量,可以是任意类型,整个类都是成员变量的范围
例题:成员变量在类中的位置
通过例题我们可以知道name的前面有一个private关键字,用来定义一个私有成员
成员方法
对应类对象的行为
包含getter,setter方法
定义成员方法的语法格式
一个成员方法可以有参数,参数可以是对象,也可以是基本类型的对象
有返回值和不返回值的选择
如果需要返回可以在方法体中使用return关键字
不需要返回可以使用void关键字
在成员方法中可以调用其他成员方法的方法和类成员变量
如果一个方法中含有与成员变量同名的成员变量,则方法中对这个变量的访问以局部变量进行
类的成员变量和成员方法可以统称为类成员
权限修饰符
声明类时不使用修饰符设置类的权限,则这个类预设为包存取范围,只有一个包的类可以访问
如果修饰符是私有的,不能被其他文件和其他文件中的类使用,那么我们可以使用getter(获取) 和setter(设置)方法,可以让变量除本类外也可以使用
快速弄好getter、setter方法
局部变量
在成员方法中定义一个变量
在方法被执行时创建,方法执行结束时销毁
使用时必须进行赋值操作或初始化,否则会出现编译错误
局部变量的有效范围
变量的作用域
在互不嵌套的区域可以定义同名、同类型的局部变量
在相互嵌套的区域不能这样声明
不能在作用范围外使用局部变量,因为作用范围没有声明局部变量的代码
this关键字
意思是这个类
不是某个new出来的实体对象,是当前编辑的类
只能在本类中使用
类的构造方法
除成员方法外的特殊类型的方法
与类同名的方法,对象的创建通过构造方法完成
每当类实例化一个对象时类会自动调用构造方法
特点
没有返回值
构造方法的名称要与本类的名称相同
快速完成构造方法
注意
定义构造方法时,构造方法没有返回值,不需要使用void关键字来修饰
定义语法格式
静态变量和静态方法
就是static,可以有静态常量、静态变量、静态方法和多个语句静态
是这个类的专属,只有这个类可以用,就是这个文件可以用,只要它们在一个文件里就行
可以在本类或其他类使用类名和.运算符调用静态成员
作用:通常为了提供共享数据或方法,同样遵行public等修饰符的约束
使用static关键字的注意
静态方法中不能使用this关键字
静态方法中不能直接调用非静态方法
局部变量不能使用static关键字声明
主方法必须使用static关键字声明
只有内部类可以使用static关键字声明
类的主方法
类的入口点,定义了程序从那开始
特性
主方法是静态的,如果要直接在主方法中调用其他方法,则该方法也要静态
没有返回值
主方法的形参为数组
对象
通过new操作符来创建对象
对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间
每个对象都是相互独立的存在,占据独立的内存地址,都有自己的生命周期
创建对象时会自动调用构造方法
在Java中初始化和创建是捆绑在一起的
访问对象的属性和行为
使用对象.类成员获取对象的属性和行为
获取类成员时相应的获取了对象的属性和行为
对象的引用
引用语法 类名 对象的引用变量
一个引用不一定需要有一个对象相关联
引用与对象相关联的语法 类名 引用变量名 = new 类名
对象的销毁
每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址需要被回收
垃圾回收器
JAVA拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器会自动回收无用却占用内存的资源
不足
只能回收那些由new操作符创建的对象
某些对象不是通过new创造并获得存储空间的这些对象是无法被垃圾回收机制所识别
某些对象不是通过new创造并获得存储空间的这些对象是无法被垃圾回收机制所识别
finalize()
是object类方法,他被声明为protected,用户可以在自己的类中定义这个方法,定义了这个方法后,垃圾回收时会首先调用该方法
system.gc()
由于垃圾回收不受人为控制,具体的执行时间也不能明确的确定,所以finalize()方法也就无法执行,因此JAVA提供了system.gc()方法来强制启动垃圾回收器,会主动告知垃圾回收器来清理垃圾
被JAVA虚拟机视为垃圾
1、对象引用超过其作用范围,这个对象将被视为垃圾
2、这个对象被赋值为null
继承、多态、抽象类、接口
类的继承
Java语言里只能继承一个父类:这个叫单继承;
父类和子类的写法要用到extends关键字
在执行过程中会先调用父类再调用子类
super()
作用:在执行该构造方法之前调用其父类构造方法
所有类的构造方法第一行都有一个隐藏的super();
子类调用成员方法遵行就近原则,先看一下自己有没有在去执行父类的
方法的重写
返回参数相同 方法名相同 传入参数相同 只有方法体不同
只有父子关系关系的时候能用,子类重写父类的方法
Object类
是所有类的父类,不论是直接继承还是间接继承都或多或少继承了它
可以省略extends
任何类都可以重写Object类的方法
toString()方法
是将一个对象返回为字符型形式,它会返回String实例
在实际的应用中通常重写to String()方法,为对象提供一个特定的输出模式
当这个类型转换为字符串或字符串连接时,将自动调用重写的toString()方法
public String toStrin() {
} 重写
} 重写
equals()方法
有两种比较对象的方式,分别为==和equals()方法
两种的区别是:
== 是比较两个对象引用内存地址相同
equals 是比较两个对象的实际内容
对象类型的转换
向上转型
子类转父类
子类对象赋值给父类引用
父类对象无法调用子类独有的方法和属性
向下转型
父类对象赋值给子类引用
通常会出现错误
修正:强制类型转换
子类类型 子类对象 =(子类类型)父类对象
父类对象可以强制转换为子类对象,但必须先引用这个子类对象
没有继承关系无法向上向下转型
使用instanceof关键字判断对象类型
向下转型时父类对象不是子类对象的实例时就会发生异常
判断父类对象是否是子类对象的实例
使用instanceof判断是否一个类实现某个接口或者说是否属于一个类
语法
返回值为布尔型
为真是实例对象
为假不是实例对象
方法的重载·
子主题
在编译器的底层逻辑,如果传入参数和返回参数类型一样,那么编译器不会认为是重载,但是在父子关系中是重写
重载用在父子关系中也是重载
重载用在父子关系中也是重载
不定长参数
语法
参数长度不定但参数类型定了
其底层逻辑就是运用数组
其底层逻辑就是运用数组
final关键字
修饰变量——不可改变的量(常量)
修饰方法——不能被重写
一个定义为private的方法隐式被指定为final类型,因此无需将一个定义为private的方法再定义为final类型(private的意思是私有)
修饰类——不能被继承
不能成为最终态类的子类
多态
子类继承父类,所形成的多种形态。就叫多态
继承父类所形成的多种结果,使用多个方法、变量、类,只要结果不同就是多态
节省了开发和维护时间,避免编写大量重复的代码
抽象类与接口
抽象方法
用abstract修饰,没有方法体,;结尾
抽象方法只能用抽象类定义
抽象类
有抽象方法的类一定是抽象类
子类继承父类,如果父类是抽象类,有抽象方法,子类是普通类,不能有抽象方法
重写就可以继承抽象类父类,同时子类维持是普通类
(这样就会形成一个规则,遇到抽象方法就重写)
接口
所有方法都是抽象方法 就是接口(不能有普通方法)
Java是单继承,它的缺点就是无法多继承,但是我们有解决办法,就是接口
每个类可以实现多个接口
实现接口关键字 implements
目的是为了实现多个结果
一个子类要继承父类还要实现接口,要先继承后实现
接口的实现类必须重写接口的抽象方法(这是接口制定的规则),不然会报错,或者变成抽象类
如果接口的实现类是抽象类,那么可以不重写一些抽象方法
包和内部类
高级特性:包、内部类
内部类
在类中定义一个类
成员内部类和匿名类都是常见的内部类
成员内部类
在一个类中使用内部类,可以在内部类中直接存放其所在类的私有成员变量
语法
可以随意使用外部类的成员方法及成员变量,尽管这些类成员被修饰为private
内部类初始化方方式用new关键词
不仅可以在外部类中使用,在其它类中也可以使用
在其他类中创建内部类对象语法
如果要在外部类和非静态方法之外实例化内部类对象
使用‘’外部类.内部类''的形式指定该对象的类型
内部类对象会依赖外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象
匿名内部类
只在创建对象时才会编写类体的一种方法
顾名思义,就是看不到内部类的名字
特点:现用现写
语法!!!最后一个大括号后有;
使用匿名内部类要遵循的规则
不能写构造方法
不能定义静态成员
如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用一次就会被Java虚拟机销毁
this关键字
就是这个类的意思
如果要调用外部类的数据就是
外部类名.this.要调用的数据
Java类包
Java中每个接口或类都来自不同的类包,无论是JavaAPI中的类与接口还是自定义的类与接口,都需要一个类包,如果没有包的存在,管理程序中的类名称将是一个非常麻烦的事情
不仅可以解决类名冲突问题,还能在庞大的程序时,帮助人员管理方便使用
定义好类后会生成.class文件,但程序规模扩大,就会产生类名冲突的现象
创建包
新建Java project文件
我们的工作台的文件夹所存在的地方就会出现新建的一个文件夹,现在这个文件夹里面什么都没有因为我们还要建立class文件
建立好class文件后,我们回到文件管理器可以在src文件夹看到我们新建的class,同时bin文件夹中也会存在.Java
在建立包的同时建立class文件,哪怕我们没有这个包,编译器也会自动生成包,然后在生成class文件。
将新建的JAVA project文件下的src文件下的.Java删除,
Java包的命名规则是必须全部使用小写字母。
导入包
使用import关键字
使用包中的多个类
使用import 关键字指定时在包指定后加上*,这表示可以在程序中使用该包中所有的类 。
例题:键盘输入 要导入扫描器,就要用import 关键字导入Scanner
static导入了java.lang.Math类中的静态成员方法 max()和Java.lang.System类中的out成员变量,这时就可以直接引用这些静态成员
异常处理
概述
在程序中,异常可能由程序员没有预料到的各种情况产生也可能由超出了程序员可控范围的环境因素产生,在Java中这些在程序运行时可能出现的一些错误称为异常
0可以作为除数吗?这个异常是算术异常
结果显示显然不可能,系统不在执行下去了,这就是异常
异常的抛出与捕获
为了保证程序的有效,要对抛出的异常进行相应的处理
抛出异常
抛出异常后,不进行处理,程序就会终止,不在执行下面的语句了
捕捉异常
大致分为try-catch和finally
try-catch
例题
我们可以知道程序没有因为异常而终止,仍然输出最后的提示信息
Java的异常处理是结构化的,不会因为一个异常影响整个程序
catch语句块里最好写入代码
如果try代码块中的代码有好几种异常,且异常处理完善了,那么,也只会执行第一个异常处理,其他的异常处理不会执行。这个叫及时止损,避免过多浪费。
finally
完整的异常处理语句一定包含finally语句,无论程序有无异常发生,并且无论之前的try-catch语句是否顺利执行完,都会执行finally语句但也有不执行的4种情况
在finally语句块中发生了异常
在前面的代码中使用了System.exit()退出程序
程序在的线程死亡
关闭CPU
Java常见的异常类
自定义异常类
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需继承Exception类即可自定义异常类
使用自定义异常类
创建自定义异常类
在方法中抛出异常
throws关键字抛出异常
通常运用在方法中,用来指定方法可能抛出的异常,多个异常可使用逗号隔开
将异常抛给上一级后,不想处理该异常可以继续向上抛,但最终要有能够处理该异常的代码
throw关键字通常用于方法体中,并且抛出一个异常对象
程序在执行到throw语句时立即终止,它后面的语句都不执行。
通过throw抛出异常后,如果想在上一级代码中捕获并处理异常则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;
如果要捕捉throw抛出的异常则,必须使用try-catch语句块
如果是Error类、RuntimeException类或它们的子类,可以不使用throws关键字,编译能顺利通过,但运行时会被系统抛出
异常的使用规则
字符串
String类
单个字符用char类型保存,多个字符需要保存在String对象中,string通常被称为字符串,最多可以保存(2^{32}-1)个字节,占4GB空间大小的文本内容
声明字符串
Java中由双引号(“ ”)包围的都是字符串,不能作为其他数据类型来使用
声明的字符串变量必须经过初始化才能用,否则编译器会报出“变量未被初始化错误
String:指定该变量为字符串类型
str:任意有效的标识符,表示字符串变量的名称
创建字符串
创建其他类一样来创建字符串对象。创建对象要使用类的构造方法。String类的常用构造方法如下:
1.String(char a[]):用一个字符数组a创建String对象
2、String(char a[ ],int offsrt,int length)
提取字符串数组中的一部分创建一个字符对象,offsrt表示截取开始的位置,length表示截取的长度代码如下:
提取字符串数组中的一部分创建一个字符对象,offsrt表示截取开始的位置,length表示截取的长度代码如下:
3、字符串常量的引用赋值来创建字符串,通过将字符串常量的引用赋值给一个字符串来创建字符串
连接字符串
连接多个字符串
使用+运算符可以实现连接多个字符串的内容。 +运算符可以连接多个String对象并产生一个新的String对象
String字符串之间相连接,并输出
连接其他数据类型
同其他基本数据类型进行连接,如果将字符串同其他数据类型相连接,会将其他数据类型的数据直接转换成字符串
实现将字符串与整型、浮点型变量相连的结果输出
只要+运算符的一个操作数是字符串,编译器就会将另一个操作数转换成字符串形式,所以应该谨慎的将其他数据类型的数据与字符串相连
获取字符串信息
获取字符串长度
使用String类的length()方法可获取声明字符串对象的长度
字符串查找
查找字符串里第一次出现该元素出现的位置元素
查找字符串里最后一次出现该元素出现的位置元素
如果lastIndexOf()方法中的是空格字符串“”(注意没有空格),则返回的结果与调用length()方法的返回结果相同
获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回
字符串操作
获取子字符串
substring(前索引)
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串
空格占一个位置
substring(前索引,后索引)前含后不含
该方法返回的是从字符串某一索引位置开始截取某一索引位置结束的子串
去除空格
trim()方法返回字符串的副本,忽略前后的空格
只能去除首尾的空格,如果要去除所有空格要用字符串的替换才能实现
字符串替换
replace()可实现将指定的字符或字符串替换成新的字符或字符串
replace()方法返回的结果是一个新的字符串,如果该字符串要替换的内容不存在字符串对象中将原字符串返回
要替换的字符要与原字符串中的字符大小写保持一致 ,否则不能成功替换
判断字符串的开始和结尾
startsWith()方法与endsWith()方法分别用于判断字符串是否以指定的内容开始或结束。返回值都为Boolean类型
startsWith()
用于判断当前字符串对象的前缀是否为参数指定的字符
endsWith()
用于判断当前字符串是否为以给定的子字符串结束
判断字符串是否相等
字符串对象进行比较不是使用比较运算符==
这是比较字符串的地址是否相同,即使两个字符串内容相同,但内存地址是不同的
要比较两个字符串内容是否相等,应该使用equals()方法和equalsIgnoreCase()方法
equals()
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true,否则返回false
equalsIgnoreCase()
使用equalsIgnoreCase()方法可以忽略大小写的情况下进行判断两个字符串是否相等,返回结果是Boolean类型
按字典顺序比较两个字符串
compare()方法为按字典顺序比较两个字符串
基于字符串中各个字符的Unicode码 按字典顺序将String对象表示的字符序列与参数字符串所表示的字符序列进行比较
前面比后面则比较结果为一个负整数,后面比前面则比较结果为一个正整数,如果两个字符串相等,则结果为0
只有在equals(Object)方法返回true时才返回0
字母大小写转换
toLowerCase()方法可将字符串中的所有大写字母改为小写字母
toUpperCase()方法可将字符串中所有小写字母改为大写字母
进行转换时数字或其他非英文字母类字符不受影响。
字符串分割
使用split()方法可以使字符串按指定的分割字符或字符串进行分割,
并将分割后的结果存放在字符串数组中
split(分割符)
根据给定的分割符对字符串进行拆分
没有统一的对字符进行分割的符号。如果想定义多个分割符,可使用符号“|”。
split(分割符,分割的次数)
可根据给定的分割符对字符串进行拆分,并限定拆分的次数
格式化字符串
Sting 类的静态fomat()方法用于创建格式化的字符串
format(格式字符串转换符,引用参数)
使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境
format(语言环境,格式字符串转换符,引用参数)
使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定的语言环境
日期和时间字符串格式化
format()方法通过给定的特殊转换符作为参数来实现对日期和时间的格式化
日期格式化
例子:返回一个月中的天数
.时间格式化
格式化常见的日期时间组合
常规类型格式化
可应用于任何参数类型
使用正则表达式
通常被用于判断语句,来检查某一字符串是否满足某一格式,含有一些具有特殊意义字符的字符串,称为正则表达式的元字符
“ . ”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符"."
必须使用转义字符“\”
必须使用转义字符“\”
限定修饰符
matches()方法
用于检测字符串是否匹配给定的正则表达式
字符串生成器
使用String创建的字符串,长度是固定的,内容不能被改变和编译,虽然可以使用+追加字符串,但+会产生一个新的String空间,如果重复的这样进行修改,会消耗更多的空间内存,而JDK的StringBuilder类则可以解决这个问题。
StringBuilder类
初始容量是16字符,可以自行指定初始长度,StringBuilder对象将自动增加长度以容纳被附加的字符,如果要StringBuilder类输出字符串结果。使用 toString()方法。利用 StringBuilder 类中的方法可动态地执行添加、删除和插入等字符串的编辑操作。该类的常用方法如下:
append()方法
用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据
insert(int offset, arg)方法
用于向字符串生成器中的指定位置插入数据内容
delete(int start , int end)方法(前删除后不删)
删除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引end-1 处的字符如果不存在这种字符,则一直到序列尾部。如果 start 等于 end,则不发生任何更改
常用类库
包装类
Java是一种面向对象语言,但Java并不能定义基本数据类型的对象,为了能够将基本收据类型视为对象进行处理,Java提出了包装类的概念,这样可以把这些基本数据类型转换为对象进行处理。
Integer类
在对象中包装了一个基本数据类型int的值,该类的对象包含一个int类型的字段
Integer类还提供了常量
例题:Integer类的常用方法
Double类
double类和float类是对double、float基本类型的封装,它们都是 Number类的子类,所以常用方法基本相同 。
intValue 以int的形式返回double值——不会四舍五入小数点后的直接去掉
例题:Double类的常用方法
Boolean 类
Boolean类将基本类型为 boolean 的值包装在一个对象中。
一个 Boolean 类型的对象只包含一个类型为 boolean 的字段。
此类还为 boolean 类型和 Sring 类型的相互转换提供了许多方法, 并提供了处理 boolean 类型时非常有用的其他一些常量和方法
Character类
Character 类在对象中包装一个基本类型为 char 的值,该类提供了多种方法,以确定字符的类别小写字母、数字等),并可以很方便地将字符从大写转换成小写,反之亦然。
Number类
对于数值型的包装类,它们有一个共同的父类一Numbr类,该类是一个抽象类
它是 Byte、Integer、Short、 Long、Flat 和 Double 类的父类,其子类必须提供将表示的数值转换为 byte、int、short、long、float 和 double 的方法。
Number的所以子类都包含以上方法
数字处理
Java 语言中,提供了一个执行数学基本运算的 Math 类,该类包括常用的数学运算方法,如三角函数方法等一些常用数学函数方法。除此之外还提供了一些常用的数学常量。
在 Java 中主要提供了两种生成随机数的方式
Java中提供了大数字的操作类,即 java.math,BigInteger 类与javamathBigDecimal类这两个类
用于高精度计算,其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的
用于高精度计算,其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的
数字格式化
在解决实际问题时应用非常普遍,如表示超市的商品价格,需要保留两位小数。
主要针对的是浮点型数据,包括double和float数据,
使用Java.text.DecimalFormat
java中没有数据格式化的数据遵行原则
DecimalFormat类是NumberFormat 的一个子类, 用于格式化十进制数字。
可以在实例化 DecimalFormat 对象时传递数字格式,也可以通过 DecimalFormat类中的applyPattern()方法来实现数字格式化。
DecimalFormat类的常用方法
SimgleFormat()
SimgleFormat()
UseApplyPatternMethodPormal0)方法
在实例化 DecimalFormat 对象后调用spplype方法设置数宇格式化模板。
在 DecimalFormat 类中,除了可通过格式化模板来格式化数字,还可以使用一些特殊方注对数行格式化设置。
Math类
提供了众多数学函数方法
主要包括三角函数方法,指数函数方法,取整函数方法,取最大值、最小值,以及平均值函数方法
这些方法都被定义为 static 形式,所以在程序中应用比较简便
使用方法
每个方法的参数和返回值都是 double型的。因为参数以弧度代替角度实现
角度与弧度的转换通常是不精确的。
Random类
随机数生成器类
通过实例化一个 Random 对象创建一个随机数生成器
因为每时每刻的时间不可能相同,所以产生的随机数不同。 如果运行速度太快,也会产生两个运行结果相同的随机数
在实例化 Random 类对象时,设置随机数生成器的种子
BigInteger 类
是 int 的包装类int 的最大值为2^{31}-1,如果要计算更大的数字要BigInteger 类来处理更大的数字使用
例题:BigInteger方法进行数学运算
divideAndRemainder()方法做除法操作,以数组的形式返回,。第一个值为做除法的商,第二个值为做除法的余数
BigDecimal类
BigDecimal类加入了小数的概念,一般的float和double 型数据只可以用来做科学计算工
程计算,但由于在商业计算中要求数字精度比较高,所以要用到BigDecimal类。
程计算,但由于在商业计算中要求数字精度比较高,所以要用到BigDecimal类。
支持任何精度的定点数,可以用它来精确计算低值。
BieDecimal 类型的数字可以用来做超大的浮点数的运算,如加、减、乘、除等,但是在所有的运
算中除法是最复杂的,因为在除不尽的情况下商小数点后的末位的处理是需要考虑的
算中除法是最复杂的,因为在除不尽的情况下商小数点后的末位的处理是需要考虑的
divide()方法的多种处理模式
System类
是 JDK 中提供的系统类,该类是用 final 修饰的,所以不允许被继。
提供的方法全部都是静态的
控制台输出字符
提供了标准输入in、标准输出out和错误输出流err
不会自动换行的 print()方法
可以自动换行的 println()方法在 就是print后面加上了“In”后缀 (就是 line 的简写)
计时
Sywem.curemTimeMillis()方法可以获取现在的毫秒数。
是为获取当前毫秒最常用的方法
可以利用该方法来记录程序的运行时间
Scanner类
作用:数字化信息流转为人类可识别的文字
使用 Scanner 类首先要引入该类
一定要记得关闭扫描器,不然会占你的内存
nextLine()方法扫描的内容是从第一个字符开始到换行符为止
next()、nextInt()等方法扫描的内容是从第一个字符开始到这段完整内容结束
使用 Scanner 类扫描控制台的代码
System.in 表示控制台输入流
时间日期类
Date类
Date 类用于表示日期时间,,使用该类表示时间需要使用其构造方法创建对象
创建 Date 对象时使用的是 long 型整数,而不是 double 型,因为 double 类型可能会损失精度
日期时间格式化
DateFormat 类是日期时间格式化子类的抽象类,可以按照指定的格式对日期或时间进行格式化
格式化风格主要包括 SHORT、MEDIUM、LONG 和FULL4种
使用 DateFormat 类还可以自定义日期时间的格式
首先需要创建 DateFormat 类的一个对象,由于它是抽象类,因此可以使用其静态方getDateInstance()进行创建
使用 getDateInstance()方法获取的是所在国家或地区的标准日期格式
使用 getTimeInstance()方法可获取所在国家或地区的时间格式
使用getDateTimeInstance()方法可获取日期和时间格式。
SimpleDateFormat的格式化字符
常用时间格式
Calendar 类提供的常用方法
add()方法和 roll()方法都用来为给定的日历字段添加或减去指定的时间量,使用 add()方法时会影响大的字段,像数学里加法的进位或错位,而使用 roll()方法设置的日期字段只是进行增加或减少,不会改变更大的字段
Runtime类
是 JDK 提供的运行时类
该类为 Java程序提供了与当前运行环境相连接的一个通道
不能使用 new 关键字创建实例,只能通过 Runtime. getRuntime()方法获取实例
执行本地命令
本地命令指的是操作系统的命令
exec()方法让 Java 代码可以执行系统的命令,exec()方法有很多重载的形式,
查看内存
通过 freeMemory()方法查看当前Java 虚拟机可用内存的剩余量
能够实时监控内存剩余量,就可以尽量控制程序对内存的占用,从而避免出现“内存溢出”的情况。
也可以用来对测试程序性能,检验程序算法是否导致内存紧张
收藏
0 条评论
下一页