Java从入门到精通
2023-06-11 19:26:39 34 举报
AI智能生成
Java从入门到精通1—11章内容
作者其他创作
大纲/内容
初识Java
Java简介
Java是一门面向对象的程序设计语言
Java语言的特性
简单
面向对象
分布性
可移植性
解释型
安全性
健壮性
多线程
高性能
动态
搭建Java环境
JDK下载
jdk下载网址:http//jdk.java.net
在win10系统下搭建JDK环境
解压缩
配置环境变量
熟悉Eclipse开发工具
熟悉Eclipse
熟悉Eclipse简介
下载Eclipse
搜索框中输入https://www.eclipse.org/downloads,按Enter键访问Eclipse
使用Eclipse
创建Java项目
选择“文件”/“新建”/“项目”命令,打开“新建项目”对话框,对该项目的向导,在向导中选择Java项目
弹出“新建项目对话框”/“项目名”文本框中输入“Myproject”,在项目布局栏选中“为源文件和类文件创建单的文件夹”单选按钮
创建Java类文件
Eclipse菜单栏中选择“文件”/“新建”/“类”命令,将打开“新建Java类”向导对话框
使用编辑器写程序代码
打开Java编译器
编写Java code
运行Java程序
helloJava 类包含main()方法,它是一个可以运行的主类
程序调试
断点
设置断点是程序调试中必不可少的手段,Java调试器每次遇到程序断点时都会将当前线程挂起,即暂停当前程序的运行
以调试方式运行Java程序
Java语言基础
Java主类机构
包声明
一个Java应用陈旭是由若干个类组成的;语句packageNumber为声明该类所在的包,package为包的关键字
成员变量和局部变量
通常将类的属性称为类的全局变量(成员变量),将方法中的属性称为局部变量,全局变量声明在类体中,局部变量声明在方法体中
主方法
main()方法是类体中的主方乏。该方法从“{”开始,至“}”结束。public、static和void分别是main()方法的权限修饰符、静态修饰符和返回值修饰符,Java程序中的main()方法必须声明public,static,void。String[]args是一个字符串类型的数组,它是main()方法的参数,main()方法是程序开始执行的位置
导入其他类
子主题
在Java中可以通过import关键字导入相关的类
基本数据类型
整数类型
byte、short、int、long
浮点类型
float(单精度)
默认情况下小数都被看作double型,若想使用float型小数,则需要在小数后面添加F或f。定义float类型变量时,如果不加F或f,系统会认为是double类型数据,进而出错。
double(双精度)
可以使用后缀d或D来明确这是一个double类型数据,但加不加d或D没有硬性规定
字符类型
char型
字符类型(char)用于存储单个字符,占用16位(2个字节)的内存空间。在定义字符类型变量时,要以单引号表示,如‘s’表示一个字符,但是“s”则表示一个字符串,虽然只有一个字符,但由于使用双引号,它仍然表示字符串,而不是字符。
转义字符
转义字符是一种特殊的字符变量,它以反斜杠“\”开头,后跟一个或多个字符。转义字符具有特定的含义,不同于字符原有的意义,故城“转义”
子主题
布尔类型
布尔类型又称逻辑类型,简称布尔型,通过关键字Boolean来定义布尔类型变量。布尔类型只有true和false两个值,分别代表逻辑中的“真”和“假”。布尔值不能与整数类型进行转换,布尔类型通常被用在流程控制中,作为判断条件。
变量与常量
标识符和关键字
标识符
标识符可以简单理解为一个名字,是用来标识类名、变量名、方法名、数组名、文件名的有效字符序列;Java语言规定标识符由任意的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字;标识符不能是java中的关键字(表留字)
关键字
关键字又称保留字,是Java语言中已经被赋予特定意义的一些单词,不可以把这些单词作为标识符来使用,如int、Boolean等都是关键字
什么是变量
声明变量
变量的使用是程序中一个十分重要的环节。声明变量就是要告诉编译器,这个变量的数据类型,这样编译器才知道需要配置多少空间给它,以及它能存放什么样的数据。
什么是常量
声明常量
在程序中一直不会改变的量称为常量,通常也被称为“final变量”,常量在整个程序中只能被赋值一次
变量的有效范围
成员变量
在类体中所声明的变量被称为成员变量,成员变量在整个类中都有效。类的成员变量又可分为2种,即静态变量和实例变量
局部变量
在类的方法体中声明的变量(方法内定义,“{”与“}”之间的代码中声明的变量)称为局部变量。局部变量只在当前代码块中有效,也就是只能在“{”和“}”之内使用。
运算符
赋值运算符
赋值运算符以符号“=”表示,它是一个二元运算符(对两个操作数处理)其功能是讲右作数所含的值赋给左方的操作数
算术运算符
Java中的算术运算符主要有+(加)、减-(减)、*(乘)、/(除)、%(求余),他们都是二元运算符。
自增和自减运算符
自增、自减运算符是弹幕运算符,可以放在操作元之前,也可以放在操作之后。操作元必须是一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增或减1。放在操作元前面的自增、自减运算符,会先将变量的值加1(减1),然后再使用该变量参与表达式的运算。放在操作元后面的的自减运算符,会先使变量表达式的运算,然后将该变量加1或减1
提示:符号在前先运算再使用
符号在后先使用再运算
符号在后先使用再运算
比较运算符
比较运算符属于二元运算符,用于程序中的变量之间、变量和自变量之间以及其他类型的信息之间的比较,比较运算符的运算结果是Boolean型
逻辑运算符
逻辑运算符包括&&(逻辑与)、||(逻辑或)、!(逻辑非)。逻辑运算符必须是boolean型数据
位运算符
位运算符除“按位与”和“按位或”运算符外,其他只能处理用于处理整数的操作数,包括byte、short、char、int和long等数据类型。
口诀:
按位与(&):两者都为1,结果才是1。
按位或(|):只要有一者为1,结果就是1。
按位取反(~):0变1,1变0
按位异或(^):两者相同为0,不同即为1。
口诀:
按位与(&):两者都为1,结果才是1。
按位或(|):只要有一者为1,结果就是1。
按位取反(~):0变1,1变0
按位异或(^):两者相同为0,不同即为1。
三元运算符
三元运算符的使用格式为:
条件式?值1:值2
条件式?值1:值2
三元运算符的运算规则为:若条件式的值为ture,则整个表达式取值1,否则取值2。例如:
Boolean b = "20<45"?ture:false;
Boolean b = "20<45"?ture:false;
运算符的优先级
Java中的表达式就是使用运算符链接起来的符合Java规则的式子。运算符的优先级决定了表达式中运算只想的先后顺序
数据类型转换
隐式转换
从低级类型向高级类型的转换,系统将自动执行,程序无须任何操作。这种类型的转换称为隐式转换。下列节本数据类型会涉及数据转换,不包括逻辑类型和字符类型。这些类型按精度从低到高的顺序为byte<short<int<long<float<double
显示转换
当把高精度的变量值赋给低精度的变量时,必须使用显示类型转换(强制类型转换)
代码注释与编码规范
单行注释
“//”为单行注释标记,从符号“//”开始直到换行为止的所有内容作为注释而被编译器忽略
多行注释
“/* */”为多行注释标记,符号“/*”与“*/”之间所有的内容均为注释内容
流程控制
复合语句
复合语句有开括号“{”开始,闭括号“}”结束。
在使用时要注意,复合语句为局部变量创建一个作用域,该作用域为程序的一部分,在该作用中某个变量被创建并能够使用。如果在某个变量的作用的作用域外使用该变量,则会发生错误。
在使用时要注意,复合语句为局部变量创建一个作用域,该作用域为程序的一部分,在该作用中某个变量被创建并能够使用。如果在某个变量的作用的作用域外使用该变量,则会发生错误。
条件语句
if条件语句
简单的if条件语句
if(布尔类型表达式){
语句序列
}
语句序列
}
if…else 语句
if(条件表达式){
语句序列1
}else{
语句序列2
}
语句序列1
}else{
语句序列2
}
if…else…if多分支语句
if(条件表达式){
语句序列1
else if(条件表达式2){
}
……
else if(条件表达式n){
}
语句序列1
else if(条件表达式2){
}
……
else if(条件表达式n){
}
switch 多分支语句
Switch (变量或表达式){
case 取值 1:
//对应取值1的代码
break;
//对应取值2的代码
break;
//…
default:
//对应其他取值的代码
break;
}
case 取值 1:
//对应取值1的代码
break;
//对应取值2的代码
break;
//…
default:
//对应其他取值的代码
break;
}
循环语句
while循环
while(条件表达式){
语句序列
}
do…while循环
do{
//循环体
} while(循环条件);
//循环体
} while(循环条件);
for循环
for(表达式1;表达式2;表达式3){
语句序列;
}
语句序列;
}
循环控制
break语句
在Java中,break语句可以用于循环或者Switch语句中,用于提前结束或者跳出包含该语句的循环或者Switch语句中,用于提前结束循环或者跳出Switch语句的执行。当程序执行到break语句时,会直接跳出包含该语句的循环或Switch语句,并且继续执行后面的代码。
同样break也可以跳出循环体。在循环中,一旦执行到break语句,循环将会被立即终止,程序会跳出循环并执行循环后的代码
同样break也可以跳出循环体。在循环中,一旦执行到break语句,循环将会被立即终止,程序会跳出循环并执行循环后的代码
continue语句
continue语句是针对break语句补充的补充,continue语句不是立即跳出循环体,二是跳过本次循环,回到循环的条件测试部分,重新开始执行循环。在for循环语句中遇到continue后,首先执行循环的增量部分,然后进行条件测试,在while和do…while循环中,continue语句使控制回到条件测试部分
数组
一维数组
创建一维数组
先声明,再使用new关键字进行内存分配
声明一维数组有两种方式。
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
声明的同时为数组分配内存
这种创建的方法是将数组的声明和内存分配合在一起执行。语法如下:
数组元素的类型 数组名= new 数组元素的类型[数组元素的个数];
数组元素的类型 数组名= new 数组元素的类型[数组元素的个数];
初始化一维数组
int arr = new int[1,2,3,4,5,25];//第一种初始化方式
int arr[] = {34,23,12,6};//第二种初始化方式
int arr[] = {34,23,12,6};//第二种初始化方式
使用一维数组
二维数组
创建二维数组
先声明,再使用new 关键字进行内存分配
声明二维数组的语法如下:
数组元素的类型 数组名字 [] [];
数组元素的类型[] [] 数组名字;
声明二维数组,代码如下:
int a[][];
数组元素的类型 数组名字 [] [];
数组元素的类型[] [] 数组名字;
声明二维数组,代码如下:
int a[][];
声明的同时为数组分配内存
第二种创建方式第一种实现的功能相同,只不过声明与赋值合并到同一行代码中。举个栗子:创建一个2行4列的二维数组,代码如下:
int a = new int[2][4];
int a = new int[2][4];
初始化二维数组
二维数组的初始化与一维数组初始化类似,同样可以使用大括号完成。语法如下:
type arrayneme[][] = {value1,value2,value3…valuen};
type arrayneme[][] = {value1,value2,value3…valuen};
使用二维数组
数组的基本操作
遍历数组
遍历数组就是获取数组中的每一个元素。通常遍历数组都是使用for循环来实现。遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度
填充替换数组元素
数组中的元素定义完成后,可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法通过各种重载形式可完成对任意类型的数组元素的替换
对数组进行排序
通过Arrays类的静态方法sort()可以实现对数组的排序。sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序。语法如下:
Arrays,sort(object)
Arrays,sort(object)
复制数组
Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。copyOf()方法是复制数组至指定长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中
copyOf()方法
该方法提供了多种重裁形式,用于满足不同类型数组的复制。语法如下:
copyOf(arr,int newlength)
arr:要进行复制的数组。
newlength:int型常量,指复制后的新数组的长度。(空位补0,溢出去掉)
该方法提供了多种重裁形式,用于满足不同类型数组的复制。语法如下:
copyOf(arr,int newlength)
arr:要进行复制的数组。
newlength:int型常量,指复制后的新数组的长度。(空位补0,溢出去掉)
查询数组
Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定数组,以获得指定对象,该方法返回要搜索元素的索引值。binarySearch()方法提供了多种重裁形式,用于满足各种类型数组的查找需要
查询数组元素,代码如下:
int arr[]=new int{4,25,10}; //创建并初始化数组
Arrays.sort(arr); //将数组进行排序
int index=Arrays.binartSearch(arr,8);
上面的代码中变量index的值是元素“8”在数组arr中索引在0~1内的索引位置。由于在指定的范围并不存在元素“8”,index的值是“-”(插入点)。如果数组进行排序,元素“8”应该在“25”的前面,因此插入点应是元素“25”的索引值为2,所以index的值是-2。
如果数组中的所有元素都小于指定的键,则为a.length(注意,这保证了当且仅档此键被找到时,返回的值将大于等于0)
int arr[]=new int{4,25,10}; //创建并初始化数组
Arrays.sort(arr); //将数组进行排序
int index=Arrays.binartSearch(arr,8);
上面的代码中变量index的值是元素“8”在数组arr中索引在0~1内的索引位置。由于在指定的范围并不存在元素“8”,index的值是“-”(插入点)。如果数组进行排序,元素“8”应该在“25”的前面,因此插入点应是元素“25”的索引值为2,所以index的值是-2。
如果数组中的所有元素都小于指定的键,则为a.length(注意,这保证了当且仅档此键被找到时,返回的值将大于等于0)
数组排序算法
冒泡排序
基本思想
冒泡排序的基本思想是对比相邻的元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到数组后面(也就是交换两个元素位置),这样较小的元素就像气泡一样从底部上升到顶部
算法实现
直接选择排序
基本思想
直接选择排序属于的基本思想是将排序位置元素与其他数组元素分别对比,如果满足条件就交换元素值
算法演示
反转排序
基本思想
反转排序的基本思想比较简单,也很好理解,其实现思路就是把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换
算法实现
类和对象
面向对象概述
(1)从这一问题中抽象出对象,这里抽象出的对象为大雁
(2)识别这个对象的属性。对象具备的属性都是静态属性,如大雁有一对翅膀、黑色的羽毛等。(3)识别这个对象的动态行为,即这只大雁可以进行的动作,如飞行、觅食等,这些行为都是这个对象基于其竖向而具有的动作,
(4)识别这个对象的属性和行为后,这个对象被定义完成了。然后,可以根据这只大雁具有的特征制定这只大雁从北方到南方的具体方案,以解决这个问题
(2)识别这个对象的属性。对象具备的属性都是静态属性,如大雁有一对翅膀、黑色的羽毛等。(3)识别这个对象的动态行为,即这只大雁可以进行的动作,如飞行、觅食等,这些行为都是这个对象基于其竖向而具有的动作,
(4)识别这个对象的属性和行为后,这个对象被定义完成了。然后,可以根据这只大雁具有的特征制定这只大雁从北方到南方的具体方案,以解决这个问题
类
成员变量
在lava 中,对象的属性也称为成员变量,成员变量可以是任意类型,整个类中均是成员变量什
范围。下面通过一个实例来演示成员变量在类中所处的位置。
创建一个 Book 类,在类中设置一个name 属性,并为该属性编写 Getter/ Setter 方法
范围。下面通过一个实例来演示成员变量在类中所处的位置。
创建一个 Book 类,在类中设置一个name 属性,并为该属性编写 Getter/ Setter 方法
在Java 语言中需要使用 class 关键字来定义类,Book 是类的名称。
同时在Book 类中定义了一个成员变量,成员变量的类型为 String 类型。其实成员变量就是普通的交量,
可以为它设置初始值,也可以不设置初始值。如果不设置初始值,则会有默认值。读者应该注意到成
员变量 name 前面有一个 private 关键字,它用来定义一个私有成员
同时在Book 类中定义了一个成员变量,成员变量的类型为 String 类型。其实成员变量就是普通的交量,
可以为它设置初始值,也可以不设置初始值。如果不设置初始值,则会有默认值。读者应该注意到成
员变量 name 前面有一个 private 关键字,它用来定义一个私有成员
成员方法
在Java语言中,使用成员方法对应于类对象的行为。以book类为例,它包含getName()和setName()两个方法,这两个成员方法分别为获取图书名称和设置图书名称的方法
定义成员方法的语法格式如下:
权限修饰符 返回值类型 方法名(参数类型 参数名){
… //方法体
return 返回值
}
权限修饰符 返回值类型 方法名(参数类型 参数名){
… //方法体
return 返回值
}
说明:如果一个方法中含有成员变量同名的局部变量,则方法中对这个变量的访问以局部变量进行类的成员变量和成员方法也可以统称为类成员
权限修饰符
Java中的权限修饰符主要包括private、public、和Protected这些修饰符控制着对类和类的成员变量以及成员方法的访问。如果一个类的成员变量或成员方法被修饰为 private,则该成员变量只能在本类
中被使用,在子类中是不可见的,并且对其他包的类也是不可见的。如果将类的成员变量和成员方法
的访问权限设置为 publie,那么除了可以在本类使用这些数据,还可以在子类和其他包的类中使用。如
果一个类的访问权限被设置为 private,这个类将隐藏其内的所有数据,以免用户直接访问它。如果需
要使类中的数据被子类或其他包中的类使用,可以将这个类设置为 public 访问权限。如果
一个类使用
protected 修饰符,那么只有本包内的该类的子类或其他类可以访问此类中的成员变量和成员方法。
这么看来,public 和protected 修饰的类可以由子类访问,如果子类和父类不在同一包中,那么只
有修饰符为public 的类可以被子类进行访问。如果父类不允许通过继承产生的子类访问它的成员变量,
那么必须使用 private 声明父类的这个成员变量。表6.1 中描述了private、protected 和 public 修饰符的修饰权限
中被使用,在子类中是不可见的,并且对其他包的类也是不可见的。如果将类的成员变量和成员方法
的访问权限设置为 publie,那么除了可以在本类使用这些数据,还可以在子类和其他包的类中使用。如
果一个类的访问权限被设置为 private,这个类将隐藏其内的所有数据,以免用户直接访问它。如果需
要使类中的数据被子类或其他包中的类使用,可以将这个类设置为 public 访问权限。如果
一个类使用
protected 修饰符,那么只有本包内的该类的子类或其他类可以访问此类中的成员变量和成员方法。
这么看来,public 和protected 修饰的类可以由子类访问,如果子类和父类不在同一包中,那么只
有修饰符为public 的类可以被子类进行访问。如果父类不允许通过继承产生的子类访问它的成员变量,
那么必须使用 private 声明父类的这个成员变量。表6.1 中描述了private、protected 和 public 修饰符的修饰权限
局部变量
this关键字
this关键字用于表示本类当前的对象,当前对象不是某个new出来的实体对象,而是当前正在编辑的类。this关键字只能在本类中使用
类的构造方法
构造方法的特点如下:
1.构造方法没有返回值
2.构造方法的名称要与本类的名称相同
构造方法的定义语法格式如下:
public Book(){
... //构造方法体
}
1.构造方法没有返回值
2.构造方法的名称要与本类的名称相同
构造方法的定义语法格式如下:
public Book(){
... //构造方法体
}
静态成员
静态变量
在介绍静态变量和静态方法之前,首先要要介绍static关键字,因为由static修饰的变量和方法被称为静态变量和静态方法
静态方法
类的主方法
语法
public static void main(String[] args){
... //方法体
}
... //方法体
}
在主方法的定义中可以看到其具有以下特性:
主方法是静态的,所以如要直接在主方法中调用其他方法,则该方法必须也是静态的。
主方法没有返回值。
主方法的形参为数且。其中,args[0]~args[n]分別代表程序的第一个参数到第n个参数,可以使用arga.length获取参数的个数
主方法是静态的,所以如要直接在主方法中调用其他方法,则该方法必须也是静态的。
主方法没有返回值。
主方法的形参为数且。其中,args[0]~args[n]分別代表程序的第一个参数到第n个参数,可以使用arga.length获取参数的个数
对象
创建
使用new操作符调用构造方法创建对象,语法如下:
Test test =new Test();
Test test =new Test("a");
Test test =new Test();
Test test =new Test("a");
访问属性和行为
使用new操作符创建一个对象后,可以通过使用“对象.类成员”来获取对象的属性和行为
引用
类名 对象的引用变量
销毁
每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址需要被回收
何种对象会被Java虚拟机视为“垃圾”。主要包括以下两种情况:
对象引用超过其作用范围,这个对象将被视为垃圾
何种对象会被Java虚拟机视为“垃圾”。主要包括以下两种情况:
对象引用超过其作用范围,这个对象将被视为垃圾
继承、多态、抽象类与接口
类的继承
一个类继承另一个类需要使用关键字extends,关键字extends的使用方法如下:
class Child extends Parent{ }
因为Java只支持单继承,即一个类只能有一个父类,所以类下面的代码是错误的:
class Child estends Parent1,parents2{ }
子类在继承父类之后,创建子类对象的同时也会调用父类的构造方法
class Child extends Parent{ }
因为Java只支持单继承,即一个类只能有一个父类,所以类下面的代码是错误的:
class Child estends Parent1,parents2{ }
子类在继承父类之后,创建子类对象的同时也会调用父类的构造方法
Object类
Object类是比较特殊的类,它是所有类的父类,是Java类层中最高层类。用户创建一个类时,除非已经指定要从其他类继承,否则它就是从Java.lang.Object类继承而来的。Java中的每个类都源于Java.lang.Object类,如String类、Integer类等都是继承Object类。除此之外,自定义的类也都继承于Object类。
在Object类中,主要包括clone()、finalize()、equals()、toString()等方法,由于所有的类都是Object类的子类,所以任何类都可以重写Object类中的方法
在Object类中,主要包括clone()、finalize()、equals()、toString()等方法,由于所有的类都是Object类的子类,所以任何类都可以重写Object类中的方法
getClass()方法
getClass()方法是Object类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。语法如下:
getClass().getname();
可以将getClass()方法与toString()方法联合使用
getClass().getname();
可以将getClass()方法与toString()方法联合使用
toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法
equals()方法
在Java语言中,有两种比较对象的方式,分别为“==”运算符与equals()方法。两者的区别在于:“==”比较的两个对象引用内地地址是否相等,而equals()方法比较的是两个对象的实际内容
对象类型的转换
向上转型
向上转型可以被理解为将子类类型的对象转换为父类类型的对象,即把子类类型的对象之间赋值给父类类型的对象,进而实现按照父类描述子类的效果
向下转型
向下转型可以被理解为将父类类型的对象转换为子类类型的对象。但是,运用向下转型,如果把一个较抽象的类的对象转换为一个较具体的类的对象,这样的转型通常会出现错误
使用instanceof关键字判断对象类型
当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型之前需要养成一个良好的习惯,就是判断父类对象是否为子类对象的实例。可以使用instanceof关键字判断是否一个类实现了某个接口,也可以用它来判断一个实例对象是否属于一个类
语法
myobject instanceof ExampleClass
myobject:某类的对象引用
myobject:某类的对象引用
方法的重载
方法的重载就是在同一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可
final关键字
final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。通常,由final定义的变量为常量。例如,在类中定义PI值,可以使用如下语句:
final double PI = 3.14;
final double PI = 3.14;
子主题
final方法
将方法定义为final类型,可以防止子类修改父类的定义与实现方式,同时定义final的方法的执行效率要高于非final方法,在修饰权限中曾经提到过private修饰符,如果一个父类的某个方法被设置为private,子类将无法访问该方法,自然无法覆盖该方法。也就是说,一个定义为private的方法隐式被指定为final类型,因此无须将一个定义为private的方法再定义为final类型
private final void test(){
…省略一些程序代码
}
…省略一些程序代码
}
final类
定义为final的类不能被继承。如果希望一个类不被任何类继承,并且不允许其他人对这个类进行任何改动,可以将这个类设置为final类
语法
final 类名{}
如果将某个类设置为final类,则该类中的所有方法都被隐式设置为final方法,但是final类中的成员变量可以被定义为final或非final形式
如果将某个类设置为final类,则该类中的所有方法都被隐式设置为final方法,但是final类中的成员变量可以被定义为final或非final形式
多态抽象类与接口
多态
多态的意思是多种形态,利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理。已经学习过子类对象可以作为父类的对象实例使用,这种将子类对象视为父类对象的做法称为“向上转型”
抽象类
抽象方法:修饰符 abstract 返回参数 方法名(传入参数);
使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法。抽象方法没有方法体,没有意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承没有任何意义
使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法。抽象方法没有方法体,没有意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承没有任何意义
语法
public abstract class Parent{ //修饰类 abstract class 类名
abstract void testAbstract(); //定义抽象方法
abstract void testAbstract(); //定义抽象方法
接口
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体,上一节抽象遗留的问题,可以将draw()方法封装到一个接口中,使需要draw()方法的类实现这个接口,同时也继承图形类,这个就是接口的必要性。
Java中不允许出现多重继承,但使用接口就可以实现多重继承。一个类可以同时实现多个接口,因此可以将所有需要继承的接口放置在implement关键字后并使用逗号隔开。实现多个接口的语法如下:
class 类名 implement 接口1,接口2,····,接口n
Java中不允许出现多重继承,但使用接口就可以实现多重继承。一个类可以同时实现多个接口,因此可以将所有需要继承的接口放置在implement关键字后并使用逗号隔开。实现多个接口的语法如下:
class 类名 implement 接口1,接口2,····,接口n
语法
但这可能会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法。一个接口可以继承另一个接口,语法如下:
interface intf1{}
interface intf2 extendsintf1{} //接口继承接口
interface intf1{}
interface intf2 extendsintf1{} //接口继承接口
包和内部类
Java类包
类名冲突
Java中每个接口或类都来自不同的类名,无论是Java API中的类与接口还是自定义的类与接口,都需要隶属于某一个类包
完整的类路径
一个程序中同时使用到java.util.Date类与java.sqlDate类,如果在程序中不指定完整的类路径,编译器不会知道这段代码使用的是java.util类包中的Date类还是java.sql类包中的Date类,例如:java.util.Date date = new java.util.Date();
java.sql.Date.date2 = new java.sql.Date(1000);
java.sql.Date.date2 = new java.sql.Date(1000);
创建包
在项目的src节点上右击,选择“新建”/“包”命令(英文new/Package)
弹出“新建Java包”(New Java Package)对话框,在“名称”(name)文本框中输入新建的包名,然后单击完成(Finish)
在Eclipse中创建类时,可以在新建立的包上右击,选择“新建(New)”命令,这样新建的类会保存在该包中,另外也可以在New JavaClass对话框中指定新建类所在的包
语法:package 包名
Java包的命名规则是全部使用小写字母
Java包的命名规则是全部使用小写字母
导入包
使用import关键字导入包
语法:
import com.mr.*; //导入com.mr包中所有的类
import com.mr.Math //导入com.mr包中的Math类
import com.mr.*; //导入com.mr包中所有的类
import com.mr.Math //导入com.mr包中的Math类
使用import导入静态成员
语法:import static 静态成员
内部类
成员内部类
在一个类中使用内部类,可以在内部类中直接存取其所在类的私有成员变量,语法如下:
class OuteruClass{//外部类
class InnerClass{//内部类
}
class OuteruClass{//外部类
class InnerClass{//内部类
}
使用this关键字获取内部类与外部类的引用
如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字
如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字
成员内部类不止可以 在外部类使用,在其他类中也可以使用。在其他类中创建内部类的对象语法特殊,如下:
外部类 outer = new 外部类()
外部类.内部类 inner = outer.new 内部类();
外部类 outer = new 外部类()
外部类.内部类 inner = outer.new 内部类();
匿名内部类
匿名类是只在创建对象时才会编写类体的一种写法。匿名类的特点是“现用现写”语法如下:
new 父类/父类接口(){
子类实现的内容
};
new 父类/父类接口(){
子类实现的内容
};
使用匿名类时一个遵循以下原则:
(1)匿名类不能写构造方法
(2)匿名类不能定义静态的成员
(3)如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用完一次就会被Java虚拟销毁
(1)匿名类不能写构造方法
(2)匿名类不能定义静态的成员
(3)如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用完一次就会被Java虚拟销毁
异常处理
异常概述
在程序中,异常可能由程序员没有预料到的各种情况产生,也可能由超过了程序员可控范围的环境因素产生,如用户的坏数据、试图打开一个根本不存在的文件等
异常的抛出与捕捉
抛出异常
异常抛出后,如果不做任何处理,程序就会被终止,例如,将一个字符串类型转换为整型,可以通过Integer类的parseInt()方法来实现
捕捉异常
异常捕获结构由try、catch和finally 3部分组成
try语句块存放的是可能发生的Java语句;
catch语句块在try语句块之后,用来激发被捕获的异常;
finally语句块是异常处理结果的最后执行部分,无论try语句块中的代码如何退出,都将执行finall语句块
try语句块存放的是可能发生的Java语句;
catch语句块在try语句块之后,用来激发被捕获的异常;
finally语句块是异常处理结果的最后执行部分,无论try语句块中的代码如何退出,都将执行finall语句块
try{
//程序代码块
}
catch(Exceptionytpe1 e){
//对Exceptionytpe1 的处理
}
catch(Exceptionytpe2 e){
//对Exceptionytpe2 的处理
}
...
finally{
//程序代码块
}
//程序代码块
}
catch(Exceptionytpe1 e){
//对Exceptionytpe1 的处理
}
catch(Exceptionytpe2 e){
//对Exceptionytpe2 的处理
}
...
finally{
//程序代码块
}
try-catch语句块
finally语句块
以下四种情况下,finally块不会被执行:
在finally语句块中发生了异常
在前面的代码中使用了System.exit()退出程序。
程序所在的线程死亡
关闭CPU
在finally语句块中发生了异常
在前面的代码中使用了System.exit()退出程序。
程序所在的线程死亡
关闭CPU
Java常见的异常类
在Java中,提供了一些一些异常的类用来描述经常发生的异常。其中,有的需要程序员进行捕捉处理或生命抛出,有的是由Java虚拟机自行捕捉处理
自定义异常
在方法中通过throw关键字抛出异常对象
public class MyException extends Exception{ //创建自定义异常,继承Exception类
public MyException (String ErrorMessage){ //构造方法
super(ErrorMessage); //父类构造方法
}
]
public MyException (String ErrorMessage){ //构造方法
super(ErrorMessage); //父类构造方法
}
]
在方法中抛出异常
throws关键字
throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔
throw关键字
通过throw抛出异常后,如果想在上一级代码中捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句块
运行时异常
RuntimeException异常的种类
RuntimeExcption异常是程序运行过程中抛出的异类,Java类库的每个包中定义了异常类,所有这些类都是Throwable类的子类,Throwable类派产生了两份个子类,分别是Excepion类和Error类
异常的使用原则
编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:
1、在当前方法声明中使用try-catch语句捕捉异常
2、一个方法被覆盖时,覆盖它的方法必须抛出同时的异常或异常的子类
3、如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常
1、在当前方法声明中使用try-catch语句捕捉异常
2、一个方法被覆盖时,覆盖它的方法必须抛出同时的异常或异常的子类
3、如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常
字符串
String类
声明字符串
字符串必须包含在一对双引号(“”)之内,例如:
"23.23"、"ABCD"、"你好"
以上这些都是字符串常量,字符串常量可以是系统能够显示的任何文字信息,甚至可以是单个字符。
String:指定该变量为字符串类型。
str:任意有效的标识符,表示字符串变量的名称。
声明字符串变量s,代码如下 :
String s;
"23.23"、"ABCD"、"你好"
以上这些都是字符串常量,字符串常量可以是系统能够显示的任何文字信息,甚至可以是单个字符。
String:指定该变量为字符串类型。
str:任意有效的标识符,表示字符串变量的名称。
声明字符串变量s,代码如下 :
String s;
第一种方法
第二种方法
创建字符串
在Java语言中,将字符串作为对象来处理,因此可以像创建其他类对象一样来创建字符串对象。创建对象要使用类的构造方法。String类的常用构造方法如下:
1.String(char a[])
1.String(char a[])
连接字符串
连接多个字符串
使用“+”运算符可实现连接多个字符串的功能。“+”运算符可以连接多个String对象并产生一个新的String对象
连接其他数据类型
字符串也可同其他基本数据类型进行连接。如果将字符串同其他数据类型进行连接,会将其他数据类型的数据直接转换成字符串
System.out.println("我每天花费"+booktime+"小时看书;"+(practice+booktime)+"小时上机练习");
获取字符串信息
获取字符串长度
使用String类的length()方法可获取声明的字符串对象的长度。语法如下:
str.length();
str为字符串对象
str.length();
str为字符串对象
获取字符串长度,代码如下:
String str ="We are students";
int size = str.length();
上段代码是将字符串str的长度赋值给int型变量size,此时变量size的值为15,这表示length()方法返回的字符串的长度(包括字符串中的空格)
String str ="We are students";
int size = str.length();
上段代码是将字符串str的长度赋值给int型变量size,此时变量size的值为15,这表示length()方法返回的字符串的长度(包括字符串中的空格)
字符串查找
1.indexOf(String s)
该方法用于但会参数字符串s在指定字符串中首次出现的索引位置
语法:str.indexOf(substr)
str:任意字符串对象
substr: 要搜索的字符串
查找字符a在字符串str中的索引位置,代码如下;
String str ="We are students";
int size = str.indexOf("a") //变量size的值是3
语法:str.indexOf(substr)
str:任意字符串对象
substr: 要搜索的字符串
查找字符a在字符串str中的索引位置,代码如下;
String str ="We are students";
int size = str.indexOf("a") //变量size的值是3
lastIndexOf(String str)
该方法用于但会指定字符串最后一次出现的索引位置
语法:str.lastIndexOf(substr)
str:任意字符串对象
substr:要搜索的字符串
注意:如果lastIndexOf()方法中的参数是空字符串""(注意没有空格),则返回的结果与调用length()方法的返回结果相同
语法:str.lastIndexOf(substr)
str:任意字符串对象
substr:要搜索的字符串
注意:如果lastIndexOf()方法中的参数是空字符串""(注意没有空格),则返回的结果与调用length()方法的返回结果相同
获取字指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回。
语法:str.charAt(int index)
str:任意字符串。
index:整型值,用于指定要返回字符的下标
语法:str.charAt(int index)
str:任意字符串。
index:整型值,用于指定要返回字符的下标
字符串操作
获取子字符串
通过String类的substring()方法可对字符串进行截取。substring()方法被两种不同的重载形式,来满足不同的需要
1.substring(int beginlndex)
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串。
语法:str.substring(int beginIndex)
其中,beginIndex指定从某一索引处开始截取字符串
截取字符串,代码如下:
String str ="Hello World"; //定义字符串str
String substr = str.substring(3); //获取字符串,此时substr值为lo World
注意:在字符串中,空格占用一个索引位置
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串。
语法:str.substring(int beginIndex)
其中,beginIndex指定从某一索引处开始截取字符串
截取字符串,代码如下:
String str ="Hello World"; //定义字符串str
String substr = str.substring(3); //获取字符串,此时substr值为lo World
注意:在字符串中,空格占用一个索引位置
2.substring(int beginlndex,int endIndex)
该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串
语法:substring(int beginlndex,int endIndex)
beginlndex:开始截取子字符串的索引位置
endIndex:子字符在整个字符串中的结束位置
该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串
语法:substring(int beginlndex,int endIndex)
beginlndex:开始截取子字符串的索引位置
endIndex:子字符在整个字符串中的结束位置
去除空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格
语法:str.trim()
str为任意字符串对象
语法:str.trim()
str为任意字符串对象
字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串。
语法;str.replace(CharSequence target,CharSequence replacement)
target:要替换的字符或字符串
replacement:用于替换原来字符串的内容
replace()方法返回的结果是一个新的字符串,如果字符或字符串oldChar没有出现在该对象表达式中的字符串序列中,则将原字符串返回。
语法;str.replace(CharSequence target,CharSequence replacement)
target:要替换的字符或字符串
replacement:用于替换原来字符串的内容
replace()方法返回的结果是一个新的字符串,如果字符或字符串oldChar没有出现在该对象表达式中的字符串序列中,则将原字符串返回。
判断字符串的开始与结尾
stsrtsWith()方法与endsWith()方法分别于判断是否以指定的内容开始或结束。这两个方法的返回值都为boolean类型。
1.stsrtsWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串
语法:str.endWith(String suffix) //suffix是指作为后缀的字符串
1.stsrtsWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串
语法:str.endWith(String suffix) //suffix是指作为后缀的字符串
判断字符串是否相等
对字符串对象进行比较不能简单地使用比较运算符“==”
代码:
String tom =new String("I am a student");
String jerry = new String("I am a student");
boolean b = (tom == jerry);
布尔类型变量b的值位false,因为字符串是对象,tom、jerry是引用,如下图
代码:
String tom =new String("I am a student");
String jerry = new String("I am a student");
boolean b = (tom == jerry);
布尔类型变量b的值位false,因为字符串是对象,tom、jerry是引用,如下图
1.equals()方法
如果两个两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则,返回false。
语法:str.equals(String otherstr) //其中str、otherstr是要比较的两个字符串对象
语法:str.equals(String otherstr) //其中str、otherstr是要比较的两个字符串对象
2.equalslgnoreCase()方法
使用equals()方法对字符串进行比较时是区分大小写的,而使用equalslgnoreCase()方法是在忽略了大小写的情况下比较两个字符串是否相等,返回结果仍为boolean类型
语法如下:equalslgnoreCase(String otherstr) //其中str、otherstr是要比较的两个字符串对象
语法如下:equalslgnoreCase(String otherstr) //其中str、otherstr是要比较的两个字符串对象
按字典比较两个字符串
compareToO方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将String对象表示的字符序列与参数字符串所表示的字符序列进行比较。
如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0。
语法如下:str.compareTo(String otherstr) //str、otherstr是要比较的两个字符串对象
注意:compareTo()方法只有在equals(Object)方法返回true时才返回0
如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0。
语法如下:str.compareTo(String otherstr) //str、otherstr是要比较的两个字符串对象
注意:compareTo()方法只有在equals(Object)方法返回true时才返回0
字母大小写转换
String 类的toLowerCase()方法可将字符串中的所有大写字母改写为小写字母,而toUpperCase()方法可将字符串中的所有小写字母改写为大写字母。
1.toLowerCase()方法
该方法将字符串中的所有大写字母转换为小写
语法:str.toLowerCase() //str是要进行转换的字符串
语法:str.toLowerCase() //str是要进行转换的字符串
2. toUpperCase()方法
该方法将字符串中所有小写字母转换为大写
语法:str.toUpperCase() //str是要进行转换的字符串
语法:str.toUpperCase() //str是要进行转换的字符串
字符串分割
1.split(String sign)
该方法可根据给定的分割符对字符串进行拆分
语法:str.split(String sign) //sign为分割字符串的分割符,也可以使用正则表达式
语法:str.split(String sign) //sign为分割字符串的分割符,也可以使用正则表达式
2.split(String sign,int limit)
该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数
语法:str.split(String sign,int limit)
sign:分割字符串的分割符,也可以使用正则表达式
limit:限制的分割次数
语法:str.split(String sign,int limit)
sign:分割字符串的分割符,也可以使用正则表达式
limit:限制的分割次数
格式化字符串
String 类的静态format()方法用于创建格式化的字符串。format()方法有两种重载形式。
1.format(String format,Object...args)
该方法使用指定的格式字符和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境。
语法:str.format(String format,Object...args)
format:格式化字符串
args:格式化字符串中由格式说明字符引用的参数
2.format(Local I,String format,Object...args)
该方法使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定语言环境。
语法:str.format(Local I,String format,Object...args)
I:格式化过程中要应用的语言环境。
format:格式字符串
args:格式字符串中由格式说明符引用的参数。可以为0
该方法使用指定的格式字符和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境。
语法:str.format(String format,Object...args)
format:格式化字符串
args:格式化字符串中由格式说明字符引用的参数
2.format(Local I,String format,Object...args)
该方法使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定语言环境。
语法:str.format(Local I,String format,Object...args)
I:格式化过程中要应用的语言环境。
format:格式字符串
args:格式字符串中由格式说明符引用的参数。可以为0
日期和时间字符串格式化
Date data = new Date(); //创建Date对象date
String s = String.formate("%te",date); //通过format()方法对date进行格式化
常用的日期格式化转换符如下表:
String s = String.formate("%te",date); //通过format()方法对date进行格式化
常用的日期格式化转换符如下表:
常规类型字符串
使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。
正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符
正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符
注意:在正则表达式中,“.”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符“.”,必须使用转移字符“\".
在正则表达式中,可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。
方括号元字符还可以为其他格式,如:
1. [^456]:代表4、5、6之外的任何字符
2. [a-r]:代表a~r中的任何一个字母
3. [a-zA-Z]:可表示任意一个英文字母
4. [a-e[g-z]]:代表a~e或g~z中的任何一个字母(并运算)
5. [a-o&&[def]]:代表字母d、e、f(交运算)
6. [a-d&&[^bc]]:代表字母 a、d(差运算)
在正则表达式中允许使用限定修饰符来限定元字符出现的次数。
在正则表达式中,可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。
方括号元字符还可以为其他格式,如:
1. [^456]:代表4、5、6之外的任何字符
2. [a-r]:代表a~r中的任何一个字母
3. [a-zA-Z]:可表示任意一个英文字母
4. [a-e[g-z]]:代表a~e或g~z中的任何一个字母(并运算)
5. [a-o&&[def]]:代表字母d、e、f(交运算)
6. [a-d&&[^bc]]:代表字母 a、d(差运算)
在正则表达式中允许使用限定修饰符来限定元字符出现的次数。
字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。而JDK新增了可变的字符序列StringBuilder类,大大提高了频繁增加字符串的效率
1. append()方法 笑的常用方法如下。
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如int、boolean、 char、String、double或者另一个字符串生成器等。语法如下:
append(content)
其中,content表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如int、boolean、 char、String、double或者另一个字符串生成器等。语法如下:
append(content)
其中,content表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象
2. insert(int offset,arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入int、float、char和boolean等基本数据类型的数据或其他对象。语法如下:
insert(int offset arg)
a、 offset:字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。
b、arg:将插入至字符串生成器的位置。该参数可以是任何数据类型的数据或其他对象。向字符串生成器中指定的位置添加字符,代码如下:
StringBuilder bf = new StringBuilder("hello"); //创建字符生成器
bf.insert(5, "world");
System.out,println(bf.toString()); //添加至字符生成器的位置及内容
//此时输出信息为 helloworld
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入int、float、char和boolean等基本数据类型的数据或其他对象。语法如下:
insert(int offset arg)
a、 offset:字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。
b、arg:将插入至字符串生成器的位置。该参数可以是任何数据类型的数据或其他对象。向字符串生成器中指定的位置添加字符,代码如下:
StringBuilder bf = new StringBuilder("hello"); //创建字符生成器
bf.insert(5, "world");
System.out,println(bf.toString()); //添加至字符生成器的位置及内容
//此时输出信息为 helloworld
3. delete(int start,int end)方法
移除此序列的子字符串中的字符。该子字符串从指定的start处开始,一直到索引end-1处的字符。如果不存在这种字符,则一直到序列尾部。如果start等于end,则不发生任何更改。语法如下:
delete(int start , int end)
a、 start:将要删除的字符串的起点位置。
b、 end:将要删除的字符串的终点位置。
删除指定位置的子字符串,代码如下:
StringBuilder bf = new StringBuilder("StringBuilder");
bf.delete(5,10);
System.out.println(bf.toString());
移除此序列的子字符串中的字符。该子字符串从指定的start处开始,一直到索引end-1处的字符。如果不存在这种字符,则一直到序列尾部。如果start等于end,则不发生任何更改。语法如下:
delete(int start , int end)
a、 start:将要删除的字符串的起点位置。
b、 end:将要删除的字符串的终点位置。
删除指定位置的子字符串,代码如下:
StringBuilder bf = new StringBuilder("StringBuilder");
bf.delete(5,10);
System.out.println(bf.toString());
常用类库
包装类
Integer类
Integer类在对象中包装了一个基本数据类型int的值,该类的对象包含一个int类型的字段
Integer类提供了以下4个常量:
☑MAX VALUE:表示 int 类型可取的最大值,即³¹。
2³¹−1。
☑MIN VALUE:表示 int 类型可取的最小值,即³¹。
−2³¹。
☑ SIZE:用来以二进制补码形式表示int值的位数。
☑ TYPE:表示基本类型int 的Class实例
☑MAX VALUE:表示 int 类型可取的最大值,即³¹。
2³¹−1。
☑MIN VALUE:表示 int 类型可取的最小值,即³¹。
−2³¹。
☑ SIZE:用来以二进制补码形式表示int值的位数。
☑ TYPE:表示基本类型int 的Class实例
Double类
Double类和Float 类是对double、float 基本类型的封装,它们都是Number 类的子类,都是对浮点数进行操作,所以常用方法基本相同。
Double 类在对象中包装一个基本类型为double 的值,每个Double类的对象都包含一个double 类型的字段。此外,该类还提供多个方法,可以将double 类型转换为String 类型,将String 类型转换为double类型,也提供了其他一些处理double类型时有用的常量和方法。Double类的常用方法如表11.3 所示。
Double 类在对象中包装一个基本类型为double 的值,每个Double类的对象都包含一个double 类型的字段。此外,该类还提供多个方法,可以将double 类型转换为String 类型,将String 类型转换为double类型,也提供了其他一些处理double类型时有用的常量和方法。Double类的常用方法如表11.3 所示。
Double类主要提供了以下常量:
☑MAX EXPONENT:返回 int 值,表示有限 double 变量可能具有的最大指数。
☑MIN EXPONENT:返回 int 值,表示标准化 double 变量可能具有的最小指数。
☑NEGATIVE INFINITY:返回 double 值,表示保存 double 类型的负无穷大值的常量。
☑POSITIVE INFINITY:返回 double 值,表示保存 double 类型的正无穷大值的常量。
☑MAX EXPONENT:返回 int 值,表示有限 double 变量可能具有的最大指数。
☑MIN EXPONENT:返回 int 值,表示标准化 double 变量可能具有的最小指数。
☑NEGATIVE INFINITY:返回 double 值,表示保存 double 类型的负无穷大值的常量。
☑POSITIVE INFINITY:返回 double 值,表示保存 double 类型的正无穷大值的常量。
Boolean类
Boolean类将基本类型为boolean的值包装在一个对象中。一个Boolean 类型的对象只包含一个类型为boolean的字段。此外,此类还为boolean类型和String 类型的相互转换提供了许多方法,并提供了处理boolean 类型时非常有用的其他一些常量和方法。Boolean类的常用方法如表11.4 所示。
Boolean提供了以下3个常量:
☑ TRUE:对应基值true的Boolean 对象。
☑ FALSE:对应基值false的Boolean 对象。
☑ TYPE:基本类型boolean 的Class对象
☑ TRUE:对应基值true的Boolean 对象。
☑ FALSE:对应基值false的Boolean 对象。
☑ TYPE:基本类型boolean 的Class对象
Character类
Character类在对象中包装一个基本类型为char的值,该类提供了多种方法,以确定字符的类别(小写字母、数字等),并可以很方便地将字符从大写转换成小写,反之亦然。Character 类提供了很多方法来完成对字符的操作,常用的方法如表11.5所示。
Character类提供了大量表示特定字符的常量,例如:
☑CONNECTOR_PUNCTUATION:返回 byte 型值,表示 Unicode 规范中的常规类别“ Pc ”。
☑ UNASSIGNED:返回byte 型值,表示Unicode规范中的常规类别“Cn”。
☑TITLECASE_LETTER:返回 byte 型值,表示 Unicode 规范中的常规类别“ Lt ”。
说明:Character类提供的常量有很多,详细列表可查看Java API文档。
☑CONNECTOR_PUNCTUATION:返回 byte 型值,表示 Unicode 规范中的常规类别“ Pc ”。
☑ UNASSIGNED:返回byte 型值,表示Unicode规范中的常规类别“Cn”。
☑TITLECASE_LETTER:返回 byte 型值,表示 Unicode 规范中的常规类别“ Lt ”。
说明:Character类提供的常量有很多,详细列表可查看Java API文档。
Number类
数字处理
数字格式化
在Java中没有格式化的数据遵循一下原则:
1.如果数据绝对值大于0.001并且小于10000000,使以常规小数形式表示。
2.如果数据绝对值小于0.001或者大于10000000,是用科学计数法表示。
DecimalFormat中的特殊字符及其所代表的含义如下
1.如果数据绝对值大于0.001并且小于10000000,使以常规小数形式表示。
2.如果数据绝对值小于0.001或者大于10000000,是用科学计数法表示。
DecimalFormat中的特殊字符及其所代表的含义如下
Math类
Math类提供了众多数学函数方法,这些方法都被定义为static形式
形式调用如下:Math.数学方法
在Math类中,除了函数方法外还存在一些常用数学常量,如PI、E。
形式调用如下:
Math.PI
Math.E
形式调用如下:Math.数学方法
在Math类中,除了函数方法外还存在一些常用数学常量,如PI、E。
形式调用如下:
Math.PI
Math.E
1.三角函数方法
Math类中包含的三角函数方法如下:
☑ _ public static double sin(double a);返回角的三角正弦。
☑ public static double cos(double a);返回角的三角余弦。
☑ public static double tan(double a);返回角的三角正切。
☑ public static double asin(double a):返回一个值的反正弦。
☑ public static double acos(double a):返回一个值的反余弦。
☑ public static double atan(double a):返回一个值的反正切。
☑ public static double toRadians(double angdeg):将角度转换为弧度。
☑ public static double toDegrees(double angrad):将弧度转换为角度。
☑ _ public static double sin(double a);返回角的三角正弦。
☑ public static double cos(double a);返回角的三角余弦。
☑ public static double tan(double a);返回角的三角正切。
☑ public static double asin(double a):返回一个值的反正弦。
☑ public static double acos(double a):返回一个值的反余弦。
☑ public static double atan(double a):返回一个值的反正切。
☑ public static double toRadians(double angdeg):将角度转换为弧度。
☑ public static double toDegrees(double angrad):将弧度转换为角度。
2.指数函数方法
Math类中与指数相关的函数方法如下。
☑ public static double exp(double a):用于获取e的a次方,即取eᵃ。
☑ public static double log(double a):用于取自然对数,即取lna的值。
☑ public static double log10(double a);用于取底数为10的a的对数。
☑ public static double sqrt(double a):用于取a的平方根,其中a 的值不能为负值。
☑ public static double cbrt(double a):用于取a的立方根。
☑ public static double pow(double a, double b):用于取a的b次方。
☑ public static double exp(double a):用于获取e的a次方,即取eᵃ。
☑ public static double log(double a):用于取自然对数,即取lna的值。
☑ public static double log10(double a);用于取底数为10的a的对数。
☑ public static double sqrt(double a):用于取a的平方根,其中a 的值不能为负值。
☑ public static double cbrt(double a):用于取a的立方根。
☑ public static double pow(double a, double b):用于取a的b次方。
3.取整函数方法
在具体的问题中,取整操作使用也很普遍,所以Java 在Math类中添加了数字取整方法。Math类中主要包括以下几种取整方法:
☑ public static double ceil(double a):返回大于等于参数的最小整数。
☑ public static double floor(double a):返回小于等于参数的最大整数。
☑ public static double rint(double a):返回与参数最接近的整数,如果存在两个同样接近的整数,则结果取偶数。
☑ public static int round(float a):将参数加上0.5后返回与参数最近的整数。
☑ public static long round(double a):将参数加上0.5 后返回与参数最近的整数,然后强制转换为长整型。
☑ public static double ceil(double a):返回大于等于参数的最小整数。
☑ public static double floor(double a):返回小于等于参数的最大整数。
☑ public static double rint(double a):返回与参数最接近的整数,如果存在两个同样接近的整数,则结果取偶数。
☑ public static int round(float a):将参数加上0.5后返回与参数最近的整数。
☑ public static long round(double a):将参数加上0.5 后返回与参数最近的整数,然后强制转换为长整型。
4. 取最大值、最小值、绝对值函数方法
在程序中最常用的方法就是取最大值、最小值、绝对值等,Math类中包括的操作方法如下:public static double max(double a,double b):取a与b之间的最大值。
public static int min(int a,int b):取a与b之间的最小值,参数为整型。
public static long min(long a,long b):取a与b之间的最小值,参数为长整型。public static float min(float a,float b):取a与b之间的最小值,参数为单精度浮点型。public static double min(double a,double b):取a与b之间的最小值,参数为双精度浮点型。public static int abs(int a):返回整型参数的绝对值。
public static long abs(long a):返回长整型参数的绝对值。
public static float abs(float a):返回单精度浮点型参数的绝对值。
public static double abs(double a):返回双精度浮点型参数的绝对值。
public static int min(int a,int b):取a与b之间的最小值,参数为整型。
public static long min(long a,long b):取a与b之间的最小值,参数为长整型。public static float min(float a,float b):取a与b之间的最小值,参数为单精度浮点型。public static double min(double a,double b):取a与b之间的最小值,参数为双精度浮点型。public static int abs(int a):返回整型参数的绝对值。
public static long abs(long a):返回长整型参数的绝对值。
public static float abs(float a):返回单精度浮点型参数的绝对值。
public static double abs(double a):返回双精度浮点型参数的绝对值。
Random类
Random对象创建一个随机数生成器语法如下:
Random r = new Random;
设置随机数生成器的种子 语法如下:
Random r = new Random(seedValue);
r: Random类对象。
seedValue:随机数生成器的种子。
在Random类中,提供了获取各种数据类型随机数的方法,下国之伙2今孙田计前
public int nextInt):返回一个随机整数。
public int nextInt(int n):返回大于等于0且小于n的随机
public long nextLong():返回一个随机长整型值。
public boolean nextBoolean):返回一个随机布尔型值。
public float nextFloat():返回一个随机单精度浮点型值。
public double nextDouble():返回一个随机双精度浮点型应
public double nextGaussian):返回一个概率密度为高斯少士8台晰明向叶进研
Random r = new Random;
设置随机数生成器的种子 语法如下:
Random r = new Random(seedValue);
r: Random类对象。
seedValue:随机数生成器的种子。
在Random类中,提供了获取各种数据类型随机数的方法,下国之伙2今孙田计前
public int nextInt):返回一个随机整数。
public int nextInt(int n):返回大于等于0且小于n的随机
public long nextLong():返回一个随机长整型值。
public boolean nextBoolean):返回一个随机布尔型值。
public float nextFloat():返回一个随机单精度浮点型值。
public double nextDouble():返回一个随机双精度浮点型应
public double nextGaussian):返回一个概率密度为高斯少士8台晰明向叶进研
BigInteger类
在Biglnteger类中封装了多种操作,除了基本的加、减、乘、除操作,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。
使用BigInteger类,可以实例化一个BigInteger对象,并自动调用相应的构造函数。BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。
例如,将2转换为BigInteger类型,可以使用以下语句进行初始化操作:
Biglnteger twolnstance =new Biglnteger("2");
注意:参数2的双引号不能省略,因为参数是以字符串的形式存在的。
使用BigInteger类,可以实例化一个BigInteger对象,并自动调用相应的构造函数。BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。
例如,将2转换为BigInteger类型,可以使用以下语句进行初始化操作:
Biglnteger twolnstance =new Biglnteger("2");
注意:参数2的双引号不能省略,因为参数是以字符串的形式存在的。
一旦创建了对象实例,就可以调用Biglnteger 类中的一些方法进行运算操作,包括基本的数学。算和位运算以及一些取相反数、取绝对值等操作。下面列举了Biglnteger类中常用的几种运算方法:public BigInteger add(BigInteger val):做加法运算。
public BigInteger subtract(BigInteger val):做减法运算。
public BigInteger multiply(BigInteger val):做乘法运算。
public BigInteger divide(BigInteger val):做除法运算。
public BigInteger remainder(BigInteger val):做取余操作。
public BigIntegerl] divideAndRemainder(BigInteger val):用数组返回余数和商,结果数组中第一个值为商,第二个值为余数。
public BigInteger pow(int exponent):进行取参数的exponent次方操作。
public BigInteger negate():取相反数。
public Biglnteger shiftLeft(int n):将数字左移n位,如果n为负数,做右移操作。public BigInteger shiftRight(int n):将数字右移n位,如果n为负数,做左移操作。public BigInteger and(BigInteger val):做与操作。
public BigInteger or(BigInteger val):做或操作。
public int compareTo(BigInteger val):做数字比较操作。
public boolean equals(Object x):当参数x是BigInteger类型的数字并且数值与对象实例的数值相等时,返回true。
public BigInteger min(BigInteger val):返回较小的数值。
public BigInteger max(Biglnteger val):返回较大的数值。
public BigInteger subtract(BigInteger val):做减法运算。
public BigInteger multiply(BigInteger val):做乘法运算。
public BigInteger divide(BigInteger val):做除法运算。
public BigInteger remainder(BigInteger val):做取余操作。
public BigIntegerl] divideAndRemainder(BigInteger val):用数组返回余数和商,结果数组中第一个值为商,第二个值为余数。
public BigInteger pow(int exponent):进行取参数的exponent次方操作。
public BigInteger negate():取相反数。
public Biglnteger shiftLeft(int n):将数字左移n位,如果n为负数,做右移操作。public BigInteger shiftRight(int n):将数字右移n位,如果n为负数,做左移操作。public BigInteger and(BigInteger val):做与操作。
public BigInteger or(BigInteger val):做或操作。
public int compareTo(BigInteger val):做数字比较操作。
public boolean equals(Object x):当参数x是BigInteger类型的数字并且数值与对象实例的数值相等时,返回true。
public BigInteger min(BigInteger val):返回较小的数值。
public BigInteger max(Biglnteger val):返回较大的数值。
BigDecimal类
在BigDecimal类,常用的两个构造方法如下:
BigDecimal类实现的加减乘除的方法如下:
BigDecimal类中divide()方法有多种设置,用于但会商小数点后的末尾的处理,名称和含义如下:
时间日期处理
Date类
例如,使用Date类的第2种构造方法创建一个Date类的对象,代码如下:
long timeMillis = System.currentTimeMillis(); //当前系统时间所经历的毫秒数
Date date =new Date(timeMillis);
Date类的常用方法及其说明如下:
long timeMillis = System.currentTimeMillis(); //当前系统时间所经历的毫秒数
Date date =new Date(timeMillis);
Date类的常用方法及其说明如下:
日期时间格式化
DateFormat 类是日期时间格式化子类的抽象类,可以按照指定的格式对日期或时间进行格式化。DateFormat类提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期时间Formatter,格式化风格主要包括SHORT、MEDIUM、LONG和FULL4种:
SHORT:完全为数字,如12.13.52或3:30pm。
MEDIUM:较长,如Jan 12,1952。
LONG:更长,如January 12,1952或3:30:32pm。
FULL:完全指定,如Tuesday、April 12、1952AD或3:30:42pm PST。
另外,使用DateFormat类还可以自定义日期时间的格式。要格式化一个当前语言环境下的日期,首先需要创建DateFormat类的一个对象,由于它是抽象类,因此可以使用其静态方法 getDateInstance()进行创建,语法如下:
DateFormat df =DateFormat.getDatelnstance();
DateFormat 类的常用方法及其说明如下:
SHORT:完全为数字,如12.13.52或3:30pm。
MEDIUM:较长,如Jan 12,1952。
LONG:更长,如January 12,1952或3:30:32pm。
FULL:完全指定,如Tuesday、April 12、1952AD或3:30:42pm PST。
另外,使用DateFormat类还可以自定义日期时间的格式。要格式化一个当前语言环境下的日期,首先需要创建DateFormat类的一个对象,由于它是抽象类,因此可以使用其静态方法 getDateInstance()进行创建,语法如下:
DateFormat df =DateFormat.getDatelnstance();
DateFormat 类的常用方法及其说明如下:
例如,将当前日期按照DateFormat类默认格式输出:
DateFormat df = DateFormat. getinstance();
system.out.printin(df.format(new Date());
结果如下:
2021/2/19上午9:59
输出长类型格式的当前时间:
DateFormat df =DateFormat.getTimelnstance(DateFormat.LONG);
System.out.printn(df.format(new Date());
结果如下:
CST 上午10:00:33
输出长类型格式的当前日期:
DateFormat df=DateFormat.getDate/nstance(DateFormat.LONG);
System.out.printin(df.format(new Date());
结果如下:
2021年2月19日
输出长类型格式的当前日期和时间:
DateFormat df = DateFormat.getDate Timelnstance(DateFormat.LONG, DateFormat.LONG);System,out.println(df.format(new Date()));
结果如下:
2021年2月19日CST上午10:01:12
DateFormat df = DateFormat. getinstance();
system.out.printin(df.format(new Date());
结果如下:
2021/2/19上午9:59
输出长类型格式的当前时间:
DateFormat df =DateFormat.getTimelnstance(DateFormat.LONG);
System.out.printn(df.format(new Date());
结果如下:
CST 上午10:00:33
输出长类型格式的当前日期:
DateFormat df=DateFormat.getDate/nstance(DateFormat.LONG);
System.out.printin(df.format(new Date());
结果如下:
2021年2月19日
输出长类型格式的当前日期和时间:
DateFormat df = DateFormat.getDate Timelnstance(DateFormat.LONG, DateFormat.LONG);System,out.println(df.format(new Date()));
结果如下:
2021年2月19日CST上午10:01:12
Calendar类
Calendar 提供了一个类方法 getnstance(),以获得此类型的一个通用的对象。Calendar类的grtnstance()方法返回一个Calendar对象,其日历字段已由当前日期和时间初始化,其使用方法如下:
Calendar rightNow =Calendar.getlnstance();
说明:由于Calendar类是一个抽象类,不能用new创建实例对象,因此除了使用getInstance0方法创建其对象,如果需要创建其对象,必须使用其子类,如GregorianCalendar类。
Calendar类提供的常用字段及其说明如下:
Calendar rightNow =Calendar.getlnstance();
说明:由于Calendar类是一个抽象类,不能用new创建实例对象,因此除了使用getInstance0方法创建其对象,如果需要创建其对象,必须使用其子类,如GregorianCalendar类。
Calendar类提供的常用字段及其说明如下:
最后对Calendar类的使用做出几点总结:
c.set(Calendar.DAY_OF_MONTH,0)获取的是上个月的最后一天,所以调用前需要将月份往后
加一个月。
Calendar.MONTH的第一个月是使用()记录的,所以在获得月份数字后要加1。年和日是从
开始记录的,不需要加1。
Calendar.DAY OF_WEEK的第一天是周日,周一是第二天,周六是最后一天。
c.set(Calendar.DAY_OF_MONTH,0)获取的是上个月的最后一天,所以调用前需要将月份往后
加一个月。
Calendar.MONTH的第一个月是使用()记录的,所以在获得月份数字后要加1。年和日是从
开始记录的,不需要加1。
Calendar.DAY OF_WEEK的第一天是周日,周一是第二天,周六是最后一天。
Runtime类
执行本地命令
本地命令指的是操作系统的命令。例如,在Linux系统下就表示shell命令,在Windows系统下就表示cmd命令。
Rutime类提供exec()方法让Java代码可以执行系统的命令,exec)方法有很多重载的形式,例如:
Process exec(String command)
Process exec(String, cmdarray)
command:要执行的系统命令,字符串类型。
cmdarray:要执行的命令和相应的命令参数,字符串数组类型。
其实这两个重载方式很类似,如执行“javac hellojava”这行命令,使用第一种重载方式的代码如下:
Runtime.getRuntime().exec("javac hello.java");
使用第二种重载方式的代码如下:
String command,=("javac","hello.java"];
Runtime.getRuntime().exec(command);
exec)方法会返回一个 Process对象。Process类是Java中进程类,该类是抽象类,不能使用new关键字创建实例。Process类的常用方法如表11.22所示,开发可以使用getlnputStream)方法获取进程返回的信息。
Rutime类提供exec()方法让Java代码可以执行系统的命令,exec)方法有很多重载的形式,例如:
Process exec(String command)
Process exec(String, cmdarray)
command:要执行的系统命令,字符串类型。
cmdarray:要执行的命令和相应的命令参数,字符串数组类型。
其实这两个重载方式很类似,如执行“javac hellojava”这行命令,使用第一种重载方式的代码如下:
Runtime.getRuntime().exec("javac hello.java");
使用第二种重载方式的代码如下:
String command,=("javac","hello.java"];
Runtime.getRuntime().exec(command);
exec)方法会返回一个 Process对象。Process类是Java中进程类,该类是抽象类,不能使用new关键字创建实例。Process类的常用方法如表11.22所示,开发可以使用getlnputStream)方法获取进程返回的信息。
查看内存
注意:freeMemory()方法得到的剩余内存量是近似值。
System类
输出
System类是JDK中提供的系统类,该类是用final修饰的,所以不允许被继承。Svstem类提供
服多系线层面的操作方法,并且这些方法全部都是静态的。System类提供的较常用方法如下:
11.3.1 控制台输出字符
1.不会自动换行的print()方法
printO方法的语法如下:
System.out.print("Hello!");
此方法输出“Hello”文字,输出完毕后,光标会停留在“Hello”文字末尾,不会自动换行。
2. 可以自动换行的 println()方法
printlnO方法在print后面加上了“1n”后缀(就是line的简写),语法如下:
System.out.println(”书籍是人类进步的阶梯!”);
此方法输出“书籍是人类进步的阶梯!”后会自动换行。光标停留在下一行的开头。
print()方法与println()方法输出的对比效果如下:
综上所述,Java输出换行的方法有以下两种:
System.out.print("\n"); //利用换行符\n 实现奂行
System.out.println(); //空参数即可实现换行
误区警示:
使用这两个输出方法时还要注意以下两点:
(1)“System.out.println("n");”会打印两个空行。
(2)“System.out.print);”无参数会报错。
服多系线层面的操作方法,并且这些方法全部都是静态的。System类提供的较常用方法如下:
11.3.1 控制台输出字符
1.不会自动换行的print()方法
printO方法的语法如下:
System.out.print("Hello!");
此方法输出“Hello”文字,输出完毕后,光标会停留在“Hello”文字末尾,不会自动换行。
2. 可以自动换行的 println()方法
printlnO方法在print后面加上了“1n”后缀(就是line的简写),语法如下:
System.out.println(”书籍是人类进步的阶梯!”);
此方法输出“书籍是人类进步的阶梯!”后会自动换行。光标停留在下一行的开头。
print()方法与println()方法输出的对比效果如下:
综上所述,Java输出换行的方法有以下两种:
System.out.print("\n"); //利用换行符\n 实现奂行
System.out.println(); //空参数即可实现换行
误区警示:
使用这两个输出方法时还要注意以下两点:
(1)“System.out.println("n");”会打印两个空行。
(2)“System.out.print);”无参数会报错。
计时
Scanner类
输入
Scanner类首先要引入该类,语法如下:
import java.util.Scanner; //引入Scanner类
import java.util.Scanner; //引入Scanner类
使用Scanner类扫描控制台的代码如下:
Scanner sc = new Scanner(System.in);
Scanner sc = new Scanner(System.in);
集合类
收藏
0 条评论
下一页