Java从入门到精通
2023-06-10 00:36:48 0 举报
AI智能生成
Java流程图
作者其他创作
大纲/内容
初识Java
Java简介
什么是Java语言
Java的应用领域
Java的版本
怎样学好Java
Java API 文档
Java语言的特性
搭建Java环境
JDK下载
在Windows 10系统下搭建JDK环境
熟悉Eclipse开发工具
熟悉Eclipse
Eclipse简介
下载Eclipse
安装Eclipse的中文语言包
Eclipse的配置与启动
Eclipse工作台
透视图与视图
菜单栏
工具栏
“包资源管理器”视图
“控制台”视图
使用Eclipse
创建Java项目
创建Java类文件
使用编译器编写程序代码
运行Java程序
程序调试
Java语言基础
Java主类结构
修饰词 class 类名{
程序代码
}
程序代码
}
基本数据类型
整数类型
是整数类型的数据
浮点类型
浮点数常量就是在数学中用到的小数,分为float单精度浮点数和double双精度浮点数两种类型。其中,单精度浮点数后面以F或f结尾,而双精度浮点数则以D或d结尾。当然,在使用浮点数时也可以在结尾处不加任何的后缀,此时虚拟机会默认为double双精度浮点数。浮点数常量还可以通过指数形式来表示。
字符类型
字符常量用于表示一个字符,一个字符常量要用一对英文半角格式的单引号引起来,它可以是英文字母、数字、标点符号、以及由转义序列来表示的特殊字符。
字符串常量用于表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号引起来。
一个字符串可以包含一个字符或多个字符,也可以不包含任何字符,即长度为0。
一个字符串可以包含一个字符或多个字符,也可以不包含任何字符,即长度为0。
布尔类型
布尔常量及布尔型的两个值true和false,该常量用于区分一个事物的真与假。
变量与常量
标识符和关键字
标识符:用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。
关键字:关键字又称保留字,是Java语言中已经被赋予特定意义的一些单词,不可以把这些单词作为标识符来使用。在输入代码中彩色字的即为关键字。
声明变量
告诉编译器这个变量的数据类型。
声明常量
在程序运行过程中一直不会改变的量,通常也被称为“final变量”。
变量的有效范围
在程序中,一般会根据变量的“有效范围”将变量分为“成员变量”和“局部变量”。
成员变量:在类体中所声明的变量,成员变量在整个类中都有效。
局部变量:在类的方法体中声明的变量,包括方法的参数。局部变量只在当前代码块中有效。
运算符
赋值运算符
赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量,表中列出了Java中的赋值运算符及用法。
在赋值运算符的使用中,需要注意以下几个问题:
(1) 在Java中可以通过一条赋值语句对多个变量进行赋值
int.X,Y,z;
X=Y=Z=5;//为三个变量同时赋值
intx=y=z=5;//这样写是错误的
(2)除了“=”,其它的都是特殊的赋值运算符,以“+=”为例,x += 3就相当于x=x+3,首先会进行加法运算x+3,再将运算结果赋值给变量x。-=、*=、/=、%=赋值运算符都可依此类推
在为变量赋值时,当两种类型彼此不兼容,或者目标类型取值范在为变量赋值时围小于源类型时,需要进行强制类型转换。
然而在使用+=、-=、*=、/=、%= 运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显式地声明。
在赋值运算符的使用中,需要注意以下几个问题:
(1) 在Java中可以通过一条赋值语句对多个变量进行赋值
int.X,Y,z;
X=Y=Z=5;//为三个变量同时赋值
intx=y=z=5;//这样写是错误的
(2)除了“=”,其它的都是特殊的赋值运算符,以“+=”为例,x += 3就相当于x=x+3,首先会进行加法运算x+3,再将运算结果赋值给变量x。-=、*=、/=、%=赋值运算符都可依此类推
在为变量赋值时,当两种类型彼此不兼容,或者目标类型取值范在为变量赋值时围小于源类型时,需要进行强制类型转换。
然而在使用+=、-=、*=、/=、%= 运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显式地声明。
算术运算符
算术运算符就是用来处理四则运算的符号,这是最简单、最常用的运算符号
算术运算符看上去比较简单,也很容易理解,但在实际使用时有很多需要注意的问题,具体如下:
(1)在进行自增 (++) 和自减 (--) 的运算时,如果运算符放在操作数的前面则是先进行自增或自减运算,再进行其它运算。反之,如果运算符放在操作数的后面则是先进行其它运算再进行自增或自减运算。
(2)在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有小数参与,得到的结果会是一个小数
(3) 在进行取模(%) 运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关
算术运算符看上去比较简单,也很容易理解,但在实际使用时有很多需要注意的问题,具体如下:
(1)在进行自增 (++) 和自减 (--) 的运算时,如果运算符放在操作数的前面则是先进行自增或自减运算,再进行其它运算。反之,如果运算符放在操作数的后面则是先进行其它运算再进行自增或自减运算。
(2)在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有小数参与,得到的结果会是一个小数
(3) 在进行取模(%) 运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关
自增和自减运算符
++a(--a)//表示在使用变量a之前,先计算a的值
a++(a--)//表示在使用变量a之后,再计算a的值
a++(a--)//表示在使用变量a之后,再计算a的值
比较运算符
比较运算符用于对两个数值或变量进行比较,其结果是一个布尔值,即true或false。
== 相等于
!= 不等于
< 小于
> 大于 <= 小于等于 >= 大于等于
比较运算符在使用时需要注意一个问题,不能将比较运算符“==”误写成赋值运算符“=”。
比较运算符用于对两个数值或变量进行比较,其结果是一个布尔值,即true或false。
== 相等于
!= 不等于
< 小于
> 大于 <= 小于等于 >= 大于等于
比较运算符在使用时需要注意一个问题,不能将比较运算符“==”误写成赋值运算符“=”。
逻辑运算符
&&,与
true&&ture==ture
ture&&false==false
false&&false==false
两者都为真,结果才是真
|,或
true||ture==true
true||false==ture
false||false==false
只要有一者为真就是真
!,非
!true==false
!false==ture
非真即假非假即真
true&&ture==ture
ture&&false==false
false&&false==false
两者都为真,结果才是真
|,或
true||ture==true
true||false==ture
false||false==false
只要有一者为真就是真
!,非
!true==false
!false==ture
非真即假非假即真
位运算符
&,按位与
两者都为1,结果才是1
|,按位或
只要有一者为1,结果就为1
~,按位取反
0变1,1变0
^,按位异或
两者相同即为0,不同即为1
移位操作
<<,左移
整体左移,空位补0,溢出去掉
>>,右移
整体右移,正数补0,负数补1,溢出去掉
>>>,无符号右移
整体右移,空位补0,溢出去掉
两者都为1,结果才是1
|,按位或
只要有一者为1,结果就为1
~,按位取反
0变1,1变0
^,按位异或
两者相同即为0,不同即为1
移位操作
<<,左移
整体左移,空位补0,溢出去掉
>>,右移
整体右移,正数补0,负数补1,溢出去掉
>>>,无符号右移
整体右移,空位补0,溢出去掉
三元运算符
使用格式:条件式?值1:值2
运算规则:若条件式的值为true,则整个表达式取值1,否则取值2
运算规则:若条件式的值为true,则整个表达式取值1,否则取值2
运算符优先级
在对一些复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序,我们把这种顺序称为运算符的优先级。
数据类型转换
隐式类型转换
从低级类型向高级类型的转换,系统自动执行,且不会丢失数据
显式类型转换
把高精度的变量的值赋给低精度的变量,又称强制类型转换,可能会丢失数据
代码注释与编码规范
在编写程序时为了使代码与阅读,通常会在实现功能的同时为代码写一些注释。
注释是对程序的某个功能或某行代码的解释,说明它是在Java源文件中有效,在编译程序时编译器会忽略这些注射信息,我会将其注释到class字节码文件中去。
注释是对程序的某个功能或某行代码的解释,说明它是在Java源文件中有效,在编译程序时编译器会忽略这些注射信息,我会将其注释到class字节码文件中去。
代码注释
Java中的注释有三种类型,具体如下:
单行注释:通常用于对程序中的某一行代码进行解释,用符号“//”,“//”后面为被注释的内容。
多行注释:顾名思义就是在注释中的内容可以为多行,它以符号“/*”开头,以符号“*/”结尾。
文档注释:以“/**”开头,并在注释内容末尾以“*/”结束。
单行注释:通常用于对程序中的某一行代码进行解释,用符号“//”,“//”后面为被注释的内容。
多行注释:顾名思义就是在注释中的内容可以为多行,它以符号“/*”开头,以符号“*/”结尾。
文档注释:以“/**”开头,并在注释内容末尾以“*/”结束。
编码规范
(1)Java中的程序代码可分为结构定义语句和功能执行语句。其中结构定义语句用于声明一个类或方法功能执行语句用于实现具体的功能,每条功能执行语句的最后都必须用分号(;)结束。
(2) Java语言严格区分大小写。
(3)虽然Java没有严格要求,用什么样的格式来编排程序代码,但是出于可读性的考虑,应该让自己编写的程序代码,整齐美观,层次清晰。
(4) Java程序中一句连续的字符串不能分开在两行中书写。
如果为了便于阅读,想将一个太长的字符串分在两行中书写,可以先将这个字符串分成两个字符串,然后用加号将这两个字符串连起来,在加号处断行。
(2) Java语言严格区分大小写。
(3)虽然Java没有严格要求,用什么样的格式来编排程序代码,但是出于可读性的考虑,应该让自己编写的程序代码,整齐美观,层次清晰。
(4) Java程序中一句连续的字符串不能分开在两行中书写。
如果为了便于阅读,想将一个太长的字符串分在两行中书写,可以先将这个字符串分成两个字符串,然后用加号将这两个字符串连起来,在加号处断行。
流程控制
复合语句
条件语句
if 条件语句
if语句是指如果满足某种条件,就进行某种处理,其语法格式如下所示:
if (条件语句){
代码块
}
上述语法格式中,判断条件是一个布尔值,当值为true时,才会执行{}中的语句。
if语句的执行流程如下图所示
if (条件语句){
代码块
}
上述语法格式中,判断条件是一个布尔值,当值为true时,才会执行{}中的语句。
if语句的执行流程如下图所示
if...else语句
if(表达式){
语句1
}else{
语句2
}
if后面“()”内的表达式必须是Boolean型的。
语句1
}else{
语句2
}
if后面“()”内的表达式必须是Boolean型的。
if...else if...else语句
if(判断条件1){
执行语句1
}else if(判断条件){
执行语句2
}
…
else if(判断条件n){
执行语句n
}else{
执行语句n+1
}
执行语句1
}else if(判断条件){
执行语句2
}
…
else if(判断条件n){
执行语句n
}else{
执行语句n+1
}
switch 多分支语句
Switch语句也是一种很常见的选择语句。和if条件语句不同,他只能针对某个表达式的值做出判断,从而决定执行哪一段代码。
在Switch语句中,使用Switch关键词来描述一个表达式,使用case关键字来描述和表达式结果比较的目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句,Switch语句的基本语法结果如下所示:
switch (表达式){
case 目标值 1:
执行语句 1
break;
case 目标值 2:
执行语句 2
break;
…………
执行语句 n+1
break;
}
注意:1、条件表达式的返回值类型必须是以下类型之一:int 、byte、 char、short 、string(如果传 入其他值,程序会报错。)
2、case子句中的值常量N必须是常量,而且所有case子句中的值应是不同的。
3、break语句用来在执行完一个case分支后,是程序跳出switch语句,即终止 switch语句的执行。
4、在一些特殊情况下,多个不同的case值执行一组相同的操作,这时可以不用break
while以及do..while循环嵌套
在Switch语句中,使用Switch关键词来描述一个表达式,使用case关键字来描述和表达式结果比较的目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句,Switch语句的基本语法结果如下所示:
switch (表达式){
case 目标值 1:
执行语句 1
break;
case 目标值 2:
执行语句 2
break;
…………
执行语句 n+1
break;
}
注意:1、条件表达式的返回值类型必须是以下类型之一:int 、byte、 char、short 、string(如果传 入其他值,程序会报错。)
2、case子句中的值常量N必须是常量,而且所有case子句中的值应是不同的。
3、break语句用来在执行完一个case分支后,是程序跳出switch语句,即终止 switch语句的执行。
4、在一些特殊情况下,多个不同的case值执行一组相同的操作,这时可以不用break
while以及do..while循环嵌套
循环语句
while 循环语句
while语句和if条件语句有点类似,都是根据条件判断来决定是否执行后面的代码,区别在于,while循环语句会反复的进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环结束。
While循环语句的语法结构如下所示:
while(循环条件) {
执行语句
.......
}
While循环语句的语法结构如下所示:
while(循环条件) {
执行语句
.......
}
do...while 循环语句
do...while循环语句和while循环语句功能类似。其语句结构如下:
do {
执行语句
.........
} while(循环条件);
do {
执行语句
.........
} while(循环条件);
for 循环语句
for循环语句是最常用的循环语句,一般用在循环次数已知的情况下,其语法格式如下:
for(初始化表达式;循环条件;操作表达式){
执行语句
......
}
在上述语法格式中, For后面的()中包括三部分内容,初始化表达式、循环条件和操作表达式,他们之间用“;”分隔,{}中的执行语句为循环体。
如果用1表示初始化表达式(从for循环开始带结束只执行一次)、2表达循环条件、3表示操作表达式、4表示循环体,则for循环的执行流程如下:
for(1;2;3;){
4
}
第一步,执行1
第二步,执行2,如果判断结果为 true,执行第三步,如果判断结果为 false,执行第五步
第三步,执行4
第四步,执行3,然后重复执行第二步
第五步,退出循环
for(初始化表达式;循环条件;操作表达式){
执行语句
......
}
在上述语法格式中, For后面的()中包括三部分内容,初始化表达式、循环条件和操作表达式,他们之间用“;”分隔,{}中的执行语句为循环体。
如果用1表示初始化表达式(从for循环开始带结束只执行一次)、2表达循环条件、3表示操作表达式、4表示循环体,则for循环的执行流程如下:
for(1;2;3;){
4
}
第一步,执行1
第二步,执行2,如果判断结果为 true,执行第三步,如果判断结果为 false,执行第五步
第三步,执行4
第四步,执行3,然后重复执行第二步
第五步,退出循环
循环控制
break 语句
用在switch条件语句和循环语句中,它的作用是终止某个case并跳出switch结构。 break:跳出当前循环体
while(...) do for
{ { {
... ... ...
break; break; break;
... ... ...
} }while(...); }
while(...) do for
{ { {
... ... ...
break; break; break;
... ... ...
} }while(...); }
continue 语句
用在循环语句中,它的作用是终止本次循环,执行下一次循环。可以立刻重新开始下一轮循环,而不在循环循环后面的语句。 continue:跳过本次循环
while(...) do for
{ { {
... ... ...
continue; continue; continue;
... ... ...
} }while(...); }
while(...) do for
{ { {
... ... ...
continue; continue; continue;
... ... ...
} }while(...); }
数组
数组概述
是用来存储一组或多组相同类型数据的数据类型
在程序中,可以通过“数组名.length”的方式来获取数组的长度,也就是元素的个数。
正在初始化数组时还有一种方式叫做静态初始化,就是在定义数组的同时就为数组的每个元素赋值。数组的静态初始化有两种方式。
类型【】数组名=new类型【】{元素,元素,……};
类型【】数组名={元素,元素,….};
1、每个数组的索引都有一个范围,从0~length-1,在访问数组的元素时,索引不能超过这个范围,否则程序会报错
2、在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常。
在程序中,可以通过“数组名.length”的方式来获取数组的长度,也就是元素的个数。
正在初始化数组时还有一种方式叫做静态初始化,就是在定义数组的同时就为数组的每个元素赋值。数组的静态初始化有两种方式。
类型【】数组名=new类型【】{元素,元素,……};
类型【】数组名={元素,元素,….};
1、每个数组的索引都有一个范围,从0~length-1,在访问数组的元素时,索引不能超过这个范围,否则程序会报错
2、在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常。
数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量所属的类型。一维数组的创建有两种形式。
1.先声明,再用new关键字进行内存分配
声明一维数组有下列两种方式:
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
数组元素类型决定了数组的数据类型,它可以是Java中任意的数据类型,包括简单类型和组合类型。
声明一维数组:int arr[]
声明数组后我们还不能立即访问它的任何元素,因为声明数组只是给出了数组名字和元素的数据类型,要想使用它还要为它分配内存空间。
在位数组分配内存空间时必须指明数组的长度,格式如下:
数组名字=new 数组元素的类型[数组元素的个数]
数组名字:被连接到数组变量的名称。
数组元素的个数:指定数组中变量的个数,即数组的长度。
为数组分配内存:arr=new int[5]
2. 声明的同时为数组分配内存
数组元素的类型 数组名=new 数组元素的类型[数组元素的个数];
1.先声明,再用new关键字进行内存分配
声明一维数组有下列两种方式:
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
数组元素类型决定了数组的数据类型,它可以是Java中任意的数据类型,包括简单类型和组合类型。
声明一维数组:int arr[]
声明数组后我们还不能立即访问它的任何元素,因为声明数组只是给出了数组名字和元素的数据类型,要想使用它还要为它分配内存空间。
在位数组分配内存空间时必须指明数组的长度,格式如下:
数组名字=new 数组元素的类型[数组元素的个数]
数组名字:被连接到数组变量的名称。
数组元素的个数:指定数组中变量的个数,即数组的长度。
为数组分配内存:arr=new int[5]
2. 声明的同时为数组分配内存
数组元素的类型 数组名=new 数组元素的类型[数组元素的个数];
一维数组
创建一维数组
数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量所属的类型。一维数组的创建有两种形式。
1.先声明,再用new关键字进行内存分配
声明一维数组有下列两种方式:
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
数组元素类型决定了数组的数据类型,它可以是Java中任意的数据类型,包括简单类型和组合类型。
声明一维数组:int arr[]
声明数组后我们还不能立即访问它的任何元素,因为声明数组只是给出了数组名字和元素的数据类型,要想使用它还要为它分配内存空间。
在位数组分配内存空间时必须指明数组的长度,格式如下:
数组名字=new 数组元素的类型[数组元素的个数]
数组名字:被连接到数组变量的名称。
数组元素的个数:指定数组中变量的个数,即数组的长度。
为数组分配内存:arr=new int[5]
2. 声明的同时为数组分配内存
数组元素的类型 数组名=new 数组元素的类型[数组元素的个数];
1.先声明,再用new关键字进行内存分配
声明一维数组有下列两种方式:
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
数组元素类型决定了数组的数据类型,它可以是Java中任意的数据类型,包括简单类型和组合类型。
声明一维数组:int arr[]
声明数组后我们还不能立即访问它的任何元素,因为声明数组只是给出了数组名字和元素的数据类型,要想使用它还要为它分配内存空间。
在位数组分配内存空间时必须指明数组的长度,格式如下:
数组名字=new 数组元素的类型[数组元素的个数]
数组名字:被连接到数组变量的名称。
数组元素的个数:指定数组中变量的个数,即数组的长度。
为数组分配内存:arr=new int[5]
2. 声明的同时为数组分配内存
数组元素的类型 数组名=new 数组元素的类型[数组元素的个数];
初始化一维数组
int arr[ ]=new int [ ]{1,2,3,5,25};
int arr[ ]={34,23,12,6};
int arr[ ]={34,23,12,6};
使用一维数组
public class Job1 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int day[]=new int[] {31,28,31,30,31,30,31,31,30,31,30,31};//创建并初始化一维数组
for(int i=0;i<day.length;i++) {//利用循环将信息输出
System.out.println((i+1)+"月有"+day[i]+"天");//输出每月的天数
}
}
}
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int day[]=new int[] {31,28,31,30,31,30,31,31,30,31,30,31};//创建并初始化一维数组
for(int i=0;i<day.length;i++) {//利用循环将信息输出
System.out.println((i+1)+"月有"+day[i]+"天");//输出每月的天数
}
}
}
二维数组
创建二维数组
多维数组可以简单地理解为在数组中的嵌套数组。在程序中比较常见的就是二维数组。
二维数组的定义方式:
方式一:int【】【】arr=new int【n】【m】
特点:元素固定
方式二:int【】【】arr=new int【n】【】
特点:可以让一维数组储存的元素是可变的
方式三:int【】【】arr={{1,2},{3,4,5,6},{7,8,9}};
直接把里面的所有元素的都附上
二维数组的访问同样也是通过索引去访问的
二维数组的定义方式:
方式一:int【】【】arr=new int【n】【m】
特点:元素固定
方式二:int【】【】arr=new int【n】【】
特点:可以让一维数组储存的元素是可变的
方式三:int【】【】arr={{1,2},{3,4,5,6},{7,8,9}};
直接把里面的所有元素的都附上
二维数组的访问同样也是通过索引去访问的
初始化二维数组
二维数组在初始化的时候可以分行进行初始化
int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
二维数组也可以进行放在一起进行初始化
int arr[2][3] = { 1, 2, 3, 4, 5, 6 };
二维数组在初始化的时候可以进行部分初始化
int arr[2][3] = { { 1 }, { 2 } };
这个初始化就和1, 0, 0, 2, 0, 0初始化一样(一般初始值为0)
int arr[2][3] = { 1, 2, 3 };
这个就是1, 2, 3, 0,0,0
二维数组的初始化可以省略第一维的数字,但是不能省略第二维的数字
int arr[][3] = { { 1 }, { 2 }};
这里可以看出也是用1, 0, 0, 2, 0, 0初始化
int arr[][3] = { 1 ,2 ,3, 4 };
这里用这种方式进行初始化的时候,一维的数字大小是由这个初始化数字的数量多少来取的,例如这个例子是4个数字那么就是4/3+1(如果有余数再加1)
int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
二维数组也可以进行放在一起进行初始化
int arr[2][3] = { 1, 2, 3, 4, 5, 6 };
二维数组在初始化的时候可以进行部分初始化
int arr[2][3] = { { 1 }, { 2 } };
这个初始化就和1, 0, 0, 2, 0, 0初始化一样(一般初始值为0)
int arr[2][3] = { 1, 2, 3 };
这个就是1, 2, 3, 0,0,0
二维数组的初始化可以省略第一维的数字,但是不能省略第二维的数字
int arr[][3] = { { 1 }, { 2 }};
这里可以看出也是用1, 0, 0, 2, 0, 0初始化
int arr[][3] = { 1 ,2 ,3, 4 };
这里用这种方式进行初始化的时候,一维的数字大小是由这个初始化数字的数量多少来取的,例如这个例子是4个数字那么就是4/3+1(如果有余数再加1)
使用二维数组
/*
* 随机点名器
* */
import java.security.SecureRandom;
import java.util.Scanner;
public class Bhs {
// 1、存储全班同学的姓名 创建一个存储多个同学的姓名的容器(数组)
// 键盘录入每个同学的姓名,存储到数组容器中
public static void addStudentName(String[]students) {
//键盘录入多个同学姓名存储到容器中
Scanner sc =new Scanner (System.in);
for(int i=0;i<students.length;i++){
System.out.println("存储第"+(i + 1)+"个姓名:");
students[i]=sc.next();
}
}
// 2、总览全班同学姓名
public static void printStudentName(String[]students) {
//遍历数组,得到每个同学姓名
for(int i=0;i<students.length;i++) {
String name =students[i];
System.out.println("第"+(i+1)+"个学生姓名:"+name);
}
}
// 3、随机点其中一人
public static String randomStudentName(String[] studrents) {
//根据数组产孤独,获取随机数
int index =new SecureRandom().nextInt(studrents.length);
//通过随机索引从数组中获取名字
String name =studrents[index];
return name;
}
public static void main(String[]args) {
System.out.println("-----随机点名器--------");
String[] students=new String[3];
addStudentName(students);
printStudentName(students);
String randomName=randomStudentName(students);
System.out.println("被点到名字的同学是:"+randomName);
}
}
* 随机点名器
* */
import java.security.SecureRandom;
import java.util.Scanner;
public class Bhs {
// 1、存储全班同学的姓名 创建一个存储多个同学的姓名的容器(数组)
// 键盘录入每个同学的姓名,存储到数组容器中
public static void addStudentName(String[]students) {
//键盘录入多个同学姓名存储到容器中
Scanner sc =new Scanner (System.in);
for(int i=0;i<students.length;i++){
System.out.println("存储第"+(i + 1)+"个姓名:");
students[i]=sc.next();
}
}
// 2、总览全班同学姓名
public static void printStudentName(String[]students) {
//遍历数组,得到每个同学姓名
for(int i=0;i<students.length;i++) {
String name =students[i];
System.out.println("第"+(i+1)+"个学生姓名:"+name);
}
}
// 3、随机点其中一人
public static String randomStudentName(String[] studrents) {
//根据数组产孤独,获取随机数
int index =new SecureRandom().nextInt(studrents.length);
//通过随机索引从数组中获取名字
String name =studrents[index];
return name;
}
public static void main(String[]args) {
System.out.println("-----随机点名器--------");
String[] students=new String[3];
addStudentName(students);
printStudentName(students);
String randomName=randomStudentName(students);
System.out.println("被点到名字的同学是:"+randomName);
}
}
数组的基本操作
遍历数组
操作数组时,经常需要依次访问数组中的每个元素,这种操作叫做数字的遍历。
索引思想,操作数组中的元素,赋值还是获取值,都是依赖索引 arr[0]
索引思想:操作数组。arr[0]赋值,获取
循环:循环的变量,从0开始,每次递增。
索引思想,操作数组中的元素,赋值还是获取值,都是依赖索引 arr[0]
索引思想:操作数组。arr[0]赋值,获取
循环:循环的变量,从0开始,每次递增。
填充替换数组元素
1.fall(int[] a,int value) import java.util.Arrays;//导入java.util.Arrays类
public class Job5 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[5];//创建int型数组
Arrays.fill(arr, 8);//使用同一个值对数组进行填充
for(int i=0;i<arr.length;i++) {//循环遍历数组中的元素
System.out.println("第"+i+"个元素是:"+arr[i]);//将数组中的元素依次输出
}
}
} 2.fall(int[] a,int fromlndex,int tplndex,int value) import java.util.Arrays;//导入java.util.Arrays类
public class Job6 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[] {45,12,2,10};//定义并初始化int型数组arr
Arrays.fill(arr,1,2, 8);//使用fill()方法替换数组指定范围内的元素
for(int i=0;i<arr.length;i++) {//循环遍历数组中的元素
System.out.println("第"+i+"个元素是:"+arr[i]);//将数组中的元素依次输出
}
}
}
public class Job5 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[5];//创建int型数组
Arrays.fill(arr, 8);//使用同一个值对数组进行填充
for(int i=0;i<arr.length;i++) {//循环遍历数组中的元素
System.out.println("第"+i+"个元素是:"+arr[i]);//将数组中的元素依次输出
}
}
} 2.fall(int[] a,int fromlndex,int tplndex,int value) import java.util.Arrays;//导入java.util.Arrays类
public class Job6 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[] {45,12,2,10};//定义并初始化int型数组arr
Arrays.fill(arr,1,2, 8);//使用fill()方法替换数组指定范围内的元素
for(int i=0;i<arr.length;i++) {//循环遍历数组中的元素
System.out.println("第"+i+"个元素是:"+arr[i]);//将数组中的元素依次输出
}
}
}
对数组进行排序
在操作数组时,经常需要对数组中的元素进行排序,其中冒泡排序是比较常见的一种算法。冒泡过程中,不断比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程中水中气泡上升的原理相似。
从第1个元素开始,将相邻的两个元素依次比较,直到最后两个元素完成比较,如果第1个元素比后一个大,则交换位置。整个过程完成后,触组中最后一个元素就是最大值。(相邻的两个元素进行比较换位 )(数组元素换位:临时变量) import java.util.Arrays;//导入java.util.Arrays类
public class Job9 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[] {23,42,12,8};//声明数组
Arrays.sort(arr);//将数组进行排序
for(int i=0;i<arr.length;i++) {//循环遍历排序后的数组
System.out.println(arr[i]);//将排序后数组中的各个元素输出
}
}
}
从第1个元素开始,将相邻的两个元素依次比较,直到最后两个元素完成比较,如果第1个元素比后一个大,则交换位置。整个过程完成后,触组中最后一个元素就是最大值。(相邻的两个元素进行比较换位 )(数组元素换位:临时变量) import java.util.Arrays;//导入java.util.Arrays类
public class Job9 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[] {23,42,12,8};//声明数组
Arrays.sort(arr);//将数组进行排序
for(int i=0;i<arr.length;i++) {//循环遍历排序后的数组
System.out.println(arr[i]);//将排序后数组中的各个元素输出
}
}
}
复制数组
1.copyOf(arr,int newlength) import java.util.Arrays;//导入java.util.Arrays类
public class Job7 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[] {23,42,12};//定义数组
int newarr[]=Arrays.copyOf(arr, 5);//复制数组arr
for(int i=0;i<newarr.length;i++) {//循环遍历复制后的新数组
System.out.println(newarr[i]);//将新数组输出
}
}
}
public class Job7 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[] {23,42,12};//定义数组
int newarr[]=Arrays.copyOf(arr, 5);//复制数组arr
for(int i=0;i<newarr.length;i++) {//循环遍历复制后的新数组
System.out.println(newarr[i]);//将新数组输出
}
}
}
2. copyOfRange import java.util.Arrays;//导入java.util.Arrays类
public class Job8 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[] {23,42,12,84,10};//定义数组
int newarr[]=Arrays.copyOfRange(arr,0,3);//复制数组
for(int i=0;i<newarr.length;i++) {//循环遍历复制后的新数组
System.out.println(newarr[i]);//将新数组中的每个元素输出
}
}
}
public class Job8 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int arr[]=new int[] {23,42,12,84,10};//定义数组
int newarr[]=Arrays.copyOfRange(arr,0,3);//复制数组
for(int i=0;i<newarr.length;i++) {//循环遍历复制后的新数组
System.out.println(newarr[i]);//将新数组中的每个元素输出
}
}
}
查询数组
1.binarySearch(Object[] a,Object key) import java.util.Arrays;//导入java.util.Arrays类
public class Job10 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int ia[]=new int[] {1,8,9,4,5};//定义int型数组ia
Arrays.sort(ia);//将数组进行排序
int index=Arrays.binarySearch(ia, 4);//查找数组ia中元素4的索引位置
System.out.println("4的索引位置是:"+index);//将索引输出
}
}
public class Job10 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int ia[]=new int[] {1,8,9,4,5};//定义int型数组ia
Arrays.sort(ia);//将数组进行排序
int index=Arrays.binarySearch(ia, 4);//查找数组ia中元素4的索引位置
System.out.println("4的索引位置是:"+index);//将索引输出
}
}
2.binarySearch(Object[] a,int fromlndex,int tolndex,Object key) import java.util.Arrays;//导入java.util.Arrays类
public class Job11 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
String str[]=new String[] {"ab","cd","ef","yz"};//定义Sring型数组str
Arrays.sort(str);//将数组进行排序
int index=Arrays.binarySearch(str,0,2, "cd");//在指定范围内搜索元素"cd"的索引位置
System.out.println("cd的索引位置是:"+index);//将索引输出
}
}
public class Job11 {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
String str[]=new String[] {"ab","cd","ef","yz"};//定义Sring型数组str
Arrays.sort(str);//将数组进行排序
int index=Arrays.binarySearch(str,0,2, "cd");//在指定范围内搜索元素"cd"的索引位置
System.out.println("cd的索引位置是:"+index);//将索引输出
}
}
数组排序算法
冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个,即需要进行length-1次。
第一次是对n个数进行n-1次比较,进行到最后第n个的一个是最大的;
第二次是对n-1个数进行n-2次比较,进行到最后第n-1个的一个是最大的;
......
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array= {63,4,24,1,3,15};//创建一个数组,元素是乱序的
BubbleSort sorter= new BubbleSort();//创建冒泡排序类的对象
sorter.sort(array);//调用排序方法,对数组排序
}
public void sort(int[] array) {
for (int i=1;i<array.length;i++) {
//比较相邻两个元素,比较的元素往后冒泡
for(int j=0;j<array.length-i;j++) {
if(array[j]>array[j+1]) {
int temp=array[j];//把第一个元素值保存到临时变量中
array[j]=array[j+1];//把第二个元素值保存到第一个元素单元中
array[j+1]=temp;//把临时变量(第一个元素原值)保存到第二个元素单元中
}
}
}
showArray(array);//输出冒泡排序后的数组元素
}
private void showArray(int[] array) {
// TODO Auto-generated method stub
for(int i:array) {//遍历数组
System.out.print(">"+i);//输出每个数组元素值
}
System.out.println();
}
}
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个,即需要进行length-1次。
第一次是对n个数进行n-1次比较,进行到最后第n个的一个是最大的;
第二次是对n-1个数进行n-2次比较,进行到最后第n-1个的一个是最大的;
......
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array= {63,4,24,1,3,15};//创建一个数组,元素是乱序的
BubbleSort sorter= new BubbleSort();//创建冒泡排序类的对象
sorter.sort(array);//调用排序方法,对数组排序
}
public void sort(int[] array) {
for (int i=1;i<array.length;i++) {
//比较相邻两个元素,比较的元素往后冒泡
for(int j=0;j<array.length-i;j++) {
if(array[j]>array[j+1]) {
int temp=array[j];//把第一个元素值保存到临时变量中
array[j]=array[j+1];//把第二个元素值保存到第一个元素单元中
array[j+1]=temp;//把临时变量(第一个元素原值)保存到第二个元素单元中
}
}
}
showArray(array);//输出冒泡排序后的数组元素
}
private void showArray(int[] array) {
// TODO Auto-generated method stub
for(int i:array) {//遍历数组
System.out.print(">"+i);//输出每个数组元素值
}
System.out.println();
}
}
直接选择排序
直接选择排序是一种简单的排序方法。它每次从待排序的记录序列中选取关键字最小的记录,把它同当前记录序列中的第一个记录交换位置。具体的作法是:
(1)开始时,待排序序列为R[0]…R[n-1],经过选择和交换后,R[0]中存放最小关的记录
(2)第二次待排序记录序列为R[1]…R[n-1],经过选择和交换后,R[1]为仅次于R[0]的具有次小关键字的记录;
(3)如此类推,经过n-1次选择和交换之后,R[0]…R[n-1]成为有序序列,即可实现排序
(1)开始时,待排序序列为R[0]…R[n-1],经过选择和交换后,R[0]中存放最小关的记录
(2)第二次待排序记录序列为R[1]…R[n-1],经过选择和交换后,R[1]为仅次于R[0]的具有次小关键字的记录;
(3)如此类推,经过n-1次选择和交换之后,R[0]…R[n-1]成为有序序列,即可实现排序
反转排序
反转排序就是以相反的顺序把原有数组的内容重新排序。
反转排序的基本思想比较简单,其实现思路是把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,依此类推,直到把所有数组元素反转替换。
反转排序的基本思想比较简单,其实现思路是把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,依此类推,直到把所有数组元素反转替换。
类和对象
面向对象概述
对象
对象是事物存在的实体。
通常会将对象划分为两个部分,即静态部分与动态部分。
通常会将对象划分为两个部分,即静态部分与动态部分。
静态部分
不能动的部分,这个部分称为“属性”,任何对象都会具备其自身属性,如一个人,其属性有身高、年龄、性别等。
动态部分
对象可执行的动作,这部分称为“行为”,如人的喜怒哀乐、说话、行走等。
类
封装对象的属性和行为的载体,是同一类事物的统称,具有相同特性和行为的一类事物实体被称为类。
如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称。类是构造对象时所依赖的规范,类是时间事物的抽象称呼,而对象则是这个事物对应的实体。
类对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,所以类包括对象的属性和方法。 不能将一个事物描述成一类事物,如一只鸟不能称为鸟类。
如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称。类是构造对象时所依赖的规范,类是时间事物的抽象称呼,而对象则是这个事物对应的实体。
类对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,所以类包括对象的属性和方法。 不能将一个事物描述成一类事物,如一只鸟不能称为鸟类。
封装
封装是面向对象编程的核心思想
在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
采用封装的思想保证了类内部数据结构的完整性,使用类的用户不能轻易的直接操作类的数据结构,只能执行类允许公开的数据,这样就避免了外部操作对内部数据的影响,提高了程序的可维护性。
在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
采用封装的思想保证了类内部数据结构的完整性,使用类的用户不能轻易的直接操作类的数据结构,只能执行类允许公开的数据,这样就避免了外部操作对内部数据的影响,提高了程序的可维护性。
继承
继承性主要描述的是类与类之间的关系,通过继承,可以在无需重写编写原有类的情况下,对原有类的功能进行扩展。
继承不仅增强了代码的复用性、提高开发效率,而且也减少了代码的重复性,还为程序的维护补充提供了便利。
继承不仅增强了代码的复用性、提高开发效率,而且也减少了代码的重复性,还为程序的维护补充提供了便利。
多态
多态性指的是在程序中允许出现重名现象,它指在一个类中定义的属性和方法被其它类继承后,它们可以既有不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义。例如,当听到“Cut”这个单词时,理发师的行为是剪发,演员的行为表现是停止表演,不同的对象,所表现的行为是个一样的。
类
成员变量
对象的属性也称为成员变量,成员变量可以是任意类型,整个类中均是成员变量作用范围。
public class part{//类
private String name;//String类型的成员变量
public String getName() {//name的Getter方法
return name;
}
public void setName(String name) {//name的Setter方法
this.name=name;//将参数值赋予类中的成员变量
}
}
private String name;//String类型的成员变量
public String getName() {//name的Getter方法
return name;
}
public void setName(String name) {//name的Setter方法
this.name=name;//将参数值赋予类中的成员变量
}
}
成员方法
在Java语言中,使用成员方法对应于类对象的行为。
定义成员方法的语法格式如下:
权限修饰符 返回值类型 方法名(参数类型 参数名){
.... //方法体
return 返回值;
}
定义成员方法的语法格式如下:
权限修饰符 返回值类型 方法名(参数类型 参数名){
.... //方法体
return 返回值;
}
极限修饰符
Java中的权限修饰符主要包括public、protect、default、private,这些修饰符控制着对类和类的成员变量以及成员方法的访问。
局部变量
如果在成员方法内定义一个变量,那么这个变量被称为局部变量。在实际上,方法中的形参也可以作为一个局部变量。
局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否者会出现编译错误 。
局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否者会出现编译错误 。
局部变量的有效范围
可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止。
在相互不嵌套的作用域中,可以同时声明两个名称和类型相同的局部变量。
但是在相互嵌套的区域中不可以这样声明,如果将区域变量id在方法体的for循环中再次进行定义,编译器将会报错。
this 关键字
this关键字用来表示本类当前的对象,当前对象不是某个new出来的实体对象,而是当前正在编辑的类。this关键字只能在本类中使用。
public void setName(String name) {//定义一个setName()方法
this.name=name;//将参数值赋予类中的成员变量
}
}
this除了可以调用成员变量或成员方法,还可以作为方法的返回值。
public Book getBook{
return this;//返回Book类的本类对象
}
public void setName(String name) {//定义一个setName()方法
this.name=name;//将参数值赋予类中的成员变量
}
}
this除了可以调用成员变量或成员方法,还可以作为方法的返回值。
public Book getBook{
return this;//返回Book类的本类对象
}
类的构造方法
1.构造方法的定义
在一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法,具体如下:
方法名与类名相同
在方法名的前面没有返回值类型的声明
在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束。
2.构造方法的重载
与普调方法一样,构造方法也可以重载,在一个类中可以定又多小构遗方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以运过调用不同的构造方法来为不同的属性进行就值。
在一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法,具体如下:
方法名与类名相同
在方法名的前面没有返回值类型的声明
在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束。
2.构造方法的重载
与普调方法一样,构造方法也可以重载,在一个类中可以定又多小构遗方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以运过调用不同的构造方法来为不同的属性进行就值。
在类中,除成员方法外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。
构造方法的特点:
构造方法没有返回值。
构造方法的名称要与本类的名称相同。
构造方法的定义语法格式:(public :构造方法修饰符;Book:构造方法的名称)
public Book(){
..... //构造方法体
}
在构造方法中可以为成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。
构造方法的特点:
构造方法没有返回值。
构造方法的名称要与本类的名称相同。
构造方法的定义语法格式:(public :构造方法修饰符;Book:构造方法的名称)
public Book(){
..... //构造方法体
}
在构造方法中可以为成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。
静态变量和静态方法
由static修饰的变量和方法被称为静态变量和静态方法。被声明为static的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和”.“运算符调用静态成员。语法如下:
类名.静态类成员 静态变量与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着public、private和protected修饰符的约束。
类名.静态类成员 静态变量与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着public、private和protected修饰符的约束。
总结以下使用static关键字要注意的几点:
在静态方法中不可使用this关键字。
在静态方法中不可以直接调用非静态方法。
局部变量不可以使用static关键字声明。
主方法必须用static声明。
只有内部类可以使用static关键字声明。
在静态方法中不可使用this关键字。
在静态方法中不可以直接调用非静态方法。
局部变量不可以使用static关键字声明。
主方法必须用static声明。
只有内部类可以使用static关键字声明。
类的主方法
主方法是类的入口点,它定义了程序从何处开始。主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。主方法的语法如下:
public stasti void mian(String args){
.... //方法体
}
在主方法的定义中可以看到其具有以下特点:
主方法是静态的,所以如要直接在主方法中条用其他方法,则该方法必须也是静态的。
主方法没有返回值。
主方法的形参为数组。其中,args[0]~[n]分别代表程序的第一个参数到n个参数,可以使用args.length获取参数的个数。
public stasti void mian(String args){
.... //方法体
}
在主方法的定义中可以看到其具有以下特点:
主方法是静态的,所以如要直接在主方法中条用其他方法,则该方法必须也是静态的。
主方法没有返回值。
主方法的形参为数组。其中,args[0]~[n]分别代表程序的第一个参数到n个参数,可以使用args.length获取参数的个数。
对象:对象是由类实例化而来的,所有问题都通过对象来处理。对象可以通过操作类的属性和方法来解决相应的问题
对象的创建
在Java中,对象是通过类创建出来的,因此,在程序设计时,最重要的就是类的设计。
假设要在程序中描述一个学校所有学生信息,可以先设置一个学生类(Student),在这个类中定义两个属性name、age分别表示学生的姓名和年龄,定一个方法introduce()表示学生做自我介绍。具体如下:
public class Student {
String name; //定义一个姓名属性
int age; //定义一个年龄属性
public void introduce() {
//方法中打印属性name和age的值
System.out.println("大家好,我叫" + name+ ",我今年" + age + "岁!");
}
}
假设要在程序中描述一个学校所有学生信息,可以先设置一个学生类(Student),在这个类中定义两个属性name、age分别表示学生的姓名和年龄,定一个方法introduce()表示学生做自我介绍。具体如下:
public class Student {
String name; //定义一个姓名属性
int age; //定义一个年龄属性
public void introduce() {
//方法中打印属性name和age的值
System.out.println("大家好,我叫" + name+ ",我今年" + age + "岁!");
}
}
访问对象的属性和范围
用户使用new操作对象符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。
public class People {
String name;//名字
String color;//颜色
String vioce;//叫声
public People(String name,String color,String vioce) {
this.name=name;
this.color=color;
this.vioce=vioce;
}
public void call() {//叫
System.out.println(vioce);
}
public static void main(String []args) {
People d1=new People("毛毛","白色","汪汪汪");
System.out.print(d1.name+"的颜色是"+d1.color);//访问对象的属性
System.out.print("叫起来的声音:");
d1.call();//访问对象的行为
People d2=new People("灰灰","灰色","嗷呜~");
System.out.print(d2.name+"的颜色是"+d2.color);
System.out.print("叫起来的声音:");
d2.call();
}
}
String name;//名字
String color;//颜色
String vioce;//叫声
public People(String name,String color,String vioce) {
this.name=name;
this.color=color;
this.vioce=vioce;
}
public void call() {//叫
System.out.println(vioce);
}
public static void main(String []args) {
People d1=new People("毛毛","白色","汪汪汪");
System.out.print(d1.name+"的颜色是"+d1.color);//访问对象的属性
System.out.print("叫起来的声音:");
d1.call();//访问对象的行为
People d2=new People("灰灰","灰色","嗷呜~");
System.out.print(d2.name+"的颜色是"+d2.color);
System.out.print("叫起来的声音:");
d2.call();
}
}
对象的引用
真正的操作标识符实质上是一个引用,引用的语法:
类名 对象的引用变量
b d1 =new b();
b是类名,d1是引用名,new b对象的实体;
类名 对象的引用变量
b d1 =new b();
b是类名,d1是引用名,new b对象的实体;
对象的销毁
在Java中,当一个对象成为垃圾后仍会占用内存空间,时间一长,就会导致内存空间不足。针对这种情况,Java中引入了垃圾回收机制。
一个对象在称为垃圾后会暂时保存内存中,当这样的垃圾堆积到一定程度时,Java虚拟机会启动垃圾回收器将这些垃圾对象从内存中释放。
某些对象不是通过new操作符在内存中获取存储空间的,这种对象无法被垃圾回收机制识别。在Java中,提供了一个finalizer()方法
一个对象在称为垃圾后会暂时保存内存中,当这样的垃圾堆积到一定程度时,Java虚拟机会启动垃圾回收器将这些垃圾对象从内存中释放。
某些对象不是通过new操作符在内存中获取存储空间的,这种对象无法被垃圾回收机制识别。在Java中,提供了一个finalizer()方法
继承、多态、抽象类与接口
类的继承
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物,同理,波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗继承自狗。这些动物之间会形成一个继承体系,具体如下图所示。
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。但是并不是所有都会继承 ,父类私有的不会被继承。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
在类的继承中,需要注意一些问题,具体如下:
在Java中,类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类,例如下面这种情况是不合法的。
class A{}
class B{}
class C extends A,B{} //C类不可以同时继承A类和B类
多个类可以继承一个父类,例如下面这种情况是允许的。
class A{}
class B extends A{}
class C extends A{} //类B和类C都可以继承类A
在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如C类继承自B类,而B类又可以去继承A类,这时,C类也可称作A类的子类。例如下面这种情况是允许的。
class A{}
class B extends A{} //类B继承类A,类B是类A的子类
class C extends B{} //类C继承类B,类C是类B的子类,同时也是类A的子类
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。但是并不是所有都会继承 ,父类私有的不会被继承。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
在类的继承中,需要注意一些问题,具体如下:
在Java中,类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类,例如下面这种情况是不合法的。
class A{}
class B{}
class C extends A,B{} //C类不可以同时继承A类和B类
多个类可以继承一个父类,例如下面这种情况是允许的。
class A{}
class B extends A{}
class C extends A{} //类B和类C都可以继承类A
在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如C类继承自B类,而B类又可以去继承A类,这时,C类也可称作A类的子类。例如下面这种情况是允许的。
class A{}
class B extends A{} //类B继承类A,类B是类A的子类
class C extends B{} //类C继承类B,类C是类B的子类,同时也是类A的子类
Java语言中每个类只能继承一个父类
extends 继承
父类 写法与普通写法相同
public class 父类类名(){
}
子类
public class 子类类名 extends 父类类名(){
} 所有类的构造方法第一行都有一个隐藏的“super();”
作用是在执行该构造方法之前调用其父类构造方法
extends 继承
父类 写法与普通写法相同
public class 父类类名(){
}
子类
public class 子类类名 extends 父类类名(){
} 所有类的构造方法第一行都有一个隐藏的“super();”
作用是在执行该构造方法之前调用其父类构造方法
方法的重写(子类重写父类方法):返回参数相同,方法名相同,传入参数相同,只有方法体不同 在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中下需要对继承的方法进行一些修改,即对父类的方法进行重写。需要注意的是,在子类中重写的方法需要和父类重写的方法具有相同的方法名、参数列表以及返回值类型。方法重写是对父类功能的一些改进,同时也是对父类功能的扩展,而也是多态的一个非常重要的前提就是方法的重写
子类重写父类要保证子类方法的权限必须大于或者等于父类方法权限,否则将会报错
子类重写父类要保证子类方法的权限必须大于或者等于父类方法权限,否则将会报错
object 类
Object类:所有类的父类,Java类层中的最高层类。
1.getClass()方法
getClass()方法是Object类定义的方法,它会返回对象执行时的Class实力,然后使用此实例调用getName()方法可以取得类的名称。语法如下:
getClass().getname();
可以将 getClass()方法与toString()方法联合使用。
getClass()方法是Object类定义的方法,它会返回对象执行时的Class实力,然后使用此实例调用getName()方法可以取得类的名称。语法如下:
getClass().getname();
可以将 getClass()方法与toString()方法联合使用。
2.toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类型转换为字符串或与字符串连接时,将自动用重写的toString()方法。
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类型转换为字符串或与字符串连接时,将自动用重写的toString()方法。
3.equals()方法
在Java语言中,有两种比较对象的方式,分别为“==”运算符与equals()方法。两者的区别在于:“==”比较的是两个对象引用内存地址是否相等,而equals()方法比较的是两个对象的实际内容。
在Java语言中,有两种比较对象的方式,分别为“==”运算符与equals()方法。两者的区别在于:“==”比较的是两个对象引用内存地址是否相等,而equals()方法比较的是两个对象的实际内容。
对象类型的转换
向上转型
子类对象赋值给父类引用
Animal a=new Dong();
自动类型转换
Animal a=new Dong();
自动类型转换
向下转型
父类对象赋值给子类引用
Dog a=(Dog)new Animal();
强制类型转换
Dog a=(Dog)new Animal();
强制类型转换
class Bird {}
class Pigeon extends Bird{}
public class Demo4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bird bird = new Pigeon();//某只鸽子是一只鸟
Pigeon pigeon = (Pigeon) bird;//某只鸟是一只鸽子(要进行强制类型转换)
}
}
class Pigeon extends Bird{}
public class Demo4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bird bird = new Pigeon();//某只鸽子是一只鸟
Pigeon pigeon = (Pigeon) bird;//某只鸟是一只鸽子(要进行强制类型转换)
}
}
使用 instanceof 关键字判断对象类型
语法如下:
对象名 instanceof 类名
对象名 instanceof 类名
判断对象是否属于该类或子类
对象名 instanceof 类名
判断对象是否属于该接口的实现类
对象名 instanceof 类名
对象名 instanceof 类名
判断对象是否属于该类或子类
对象名 instanceof 类名
判断对象是否属于该接口的实现类
方法的重载
重载:方法名相同,参数不同
方法重载:让方法名相同而形参不同的构造方法同时存在。
方法重载:让方法名相同而形参不同的构造方法同时存在。
与普调方法一样,构造方法也可以重载,在一个类中可以定又多小构遗方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以运过调用不同的构造方法来为不同的属性进行就值。
final关键字
final变量
final修饰变量——不能被改变(常量)
final关键字用于变量声明,一旦该变量被设定,就不可以在改变该变量的值,final关键字定义的变量必须在声明时对其进行赋值操作
语法:Final double Pi=3.14;
final关键字用于变量声明,一旦该变量被设定,就不可以在改变该变量的值,final关键字定义的变量必须在声明时对其进行赋值操作
语法:Final double Pi=3.14;
final方法
可以防止子类修改父类的定义与现实方法,执行效率高于非final方法
语法:private final void test(){
...//省略一些程序代码
}
final修饰方法—— 不能被重写
语法:private final void test(){
...//省略一些程序代码
}
final修饰方法—— 不能被重写
final类
使用final类可以使该类不被任何类继承,并且不允许其他人对这个类进行任何改动
语法:final 类名{}
Final修饰类——不能 被继承
语法:final 类名{}
Final修饰类——不能 被继承
多态
在设计一个方法时,通常希望该方法具备一定的通用性。多态的前提是要有继承,要有方法的重写。我们可以把它理解为一个事物具备的多种形态,称之为多态。比如说一个人,在不同的时期和不同的环境下它所表现出来的状态,或者形态是不一样的。在同一个方法中,参数类型不同而导致出现的运行结果也不同,那就产生出这种多态的现象。
在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果。接口的引用等于它的一个实现类的对象,这个实现类是可以有不同的子类。它有利于我们程序的扩展性的出现。
在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果。接口的引用等于它的一个实现类的对象,这个实现类是可以有不同的子类。它有利于我们程序的扩展性的出现。
多态的类型转换
1、将子类对象当中父类对象类型使用的情况,这在Java语言环境中称为“向上转型”
2、将子类对象当中父类对象使用时不需要任何显式的声明,需要注意的是,此时不能通过父类变量去调用子类中特有的方法
1、将子类对象当中父类对象类型使用的情况,这在Java语言环境中称为“向上转型”
2、将子类对象当中父类对象使用时不需要任何显式的声明,需要注意的是,此时不能通过父类变量去调用子类中特有的方法
多态的好处对父类或者接口提供程序的扩展性,坏处能调用子父类的共有属性,不能调有子类的特有属性。
抽象类与接口
抽象类
一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。
抽象方法
修饰符 abstract 返回参数 方法名(传入参数);
注释:没有方法体,要用abstract来修饰
public abstract void methodName();
抽象类 有抽象方法的类一定是抽象类
修饰符 abstract class 类名{
}
当父类为抽象类子类为普通类时,要继承父类必须重写父类中的所有方法,不然会报错,或者将子类改为抽象类
抽象方法
修饰符 abstract 返回参数 方法名(传入参数);
注释:没有方法体,要用abstract来修饰
public abstract void methodName();
抽象类 有抽象方法的类一定是抽象类
修饰符 abstract class 类名{
}
当父类为抽象类子类为普通类时,要继承父类必须重写父类中的所有方法,不然会报错,或者将子类改为抽象类
接口
接口:所有方法都是抽象方法且没有方法体
Java语言中每个类只能继承一个父类,但是每个类可以实现多个接口,所以出现了接口。
修饰符 interface 接口名{
}
实现 implements
Java语言每个类可以实现多个接口
修饰符 class 类名 implements 接口1,接口2,接口3,...{
}
一个类继承一个父类的同时再实现一个接口:
修饰符 class 类名 extends 父类名 implements 接口名{
}
注释:先继承再实现
一个接口可以继承另一个接口 :
interface intf1{}
interface intf2 extends intf1{}//接口继承接口
Java语言中每个类只能继承一个父类,但是每个类可以实现多个接口,所以出现了接口。
修饰符 interface 接口名{
}
实现 implements
Java语言每个类可以实现多个接口
修饰符 class 类名 implements 接口1,接口2,接口3,...{
}
一个类继承一个父类的同时再实现一个接口:
修饰符 class 类名 extends 父类名 implements 接口名{
}
注释:先继承再实现
一个接口可以继承另一个接口 :
interface intf1{}
interface intf2 extends intf1{}//接口继承接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一中方式来定义,即接口 。接口是由常量和抽象方法组成的特殊类,时对抽象类的进一步抽象。
在定义接口时,需要使用interface关键词来声明,其语法格式如下:
[public] interface 接口名 [extends 接口1,接口2...]{
[public] [static] [final] 数据类型 常量名 = 常量值;
[public] [abstract] 返回值 抽象方法名(参数列表);
}
在上面的语法中,一个接口可以有多个父接口,它们之间用逗号隔开。一个类只能有一个父类,而一个类可以实现多个接口。接口中的变量默认使用“public static final”来修饰,即全局常量;接口定义的方法默认“public abstract”来修饰,即抽象方法。如果接口声明为public,则接口中的变量和方法全部为public。
由于接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口中的方法。此时需要定义一个类,并使用implements关键字实现接口中所有的方法。一个类可以在继承的同时实现多个接口,在implements子句中用逗号隔开。接口的实现类声明格式如下:
[修饰符] class <类名> [extends <超类名>] [implements <接口1> ,<接口2>,......]
在定义接口时,需要使用interface关键词来声明,其语法格式如下:
[public] interface 接口名 [extends 接口1,接口2...]{
[public] [static] [final] 数据类型 常量名 = 常量值;
[public] [abstract] 返回值 抽象方法名(参数列表);
}
在上面的语法中,一个接口可以有多个父接口,它们之间用逗号隔开。一个类只能有一个父类,而一个类可以实现多个接口。接口中的变量默认使用“public static final”来修饰,即全局常量;接口定义的方法默认“public abstract”来修饰,即抽象方法。如果接口声明为public,则接口中的变量和方法全部为public。
由于接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口中的方法。此时需要定义一个类,并使用implements关键字实现接口中所有的方法。一个类可以在继承的同时实现多个接口,在implements子句中用逗号隔开。接口的实现类声明格式如下:
[修饰符] class <类名> [extends <超类名>] [implements <接口1> ,<接口2>,......]
包和内部类
Java类包
类名冲突
编译器不会允许存在同名的类文件,解决这类问题的方法是将这两个类放置在不同的类包中。
完整的类路径
1.进入Eclipse时复制文件储存路径,再打开文件管理器粘贴路径就可以之间进入Eclipse所保存文件的文件中。
2.随意点击一个文件,里面的src文件中的是Java文件,bin文件中是class文件
创建包
1.新建一个项目,然后右击src,选择new、Package。
2.弹出“新建Java包”New Java Package对话框,在“名称”Name文本框中输入的包名Package1,然后点击完成Finish.
3.在eclipse中创建类时,可以在新建立的包上右击选择新建new命令,作业新建的类就会保存在该包中。另外还可以在新建类时同时修改包名,就可以创建两个不同的包和类.
导入包
import关键字的语法如下:
import com.mr.*; //导入com.mr包中的所有类
import com.mr.Math //导入com.mr包中的Math类
在使用import关键字时,可以指定类的完整描述,如果为了使用包中更多的类,可以在使用import关键字指定时在包指定后加上*,这表示可以在程序中使用该包中的所有类。
import关键字除了导入包外,还可以导入静态成员,导入静态成员可以使编程更为方便。
import com.mr.*; //导入com.mr包中的所有类
import com.mr.Math //导入com.mr包中的Math类
在使用import关键字时,可以指定类的完整描述,如果为了使用包中更多的类,可以在使用import关键字指定时在包指定后加上*,这表示可以在程序中使用该包中的所有类。
import关键字除了导入包外,还可以导入静态成员,导入静态成员可以使编程更为方便。
package com.mr;
import static java.lang.Math.max;//导入静态成员方法
import static java.lang.System.out;//导入静态成员变量
public class Test3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
out.println("1和4的较大值为:"+max(1,4));//主方法中可以直接使用这些静态成员
}
}
import static java.lang.Math.max;//导入静态成员方法
import static java.lang.System.out;//导入静态成员变量
public class Test3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
out.println("1和4的较大值为:"+max(1,4));//主方法中可以直接使用这些静态成员
}
}
内部类
成员内部类
成员内部类的语法:
class OuterClass{ //外部类
class InnerClass{ //内部类
}
}
在成员内部类中可以随意使用外部类的成员方法及成员变量,尽管这些类成员被修饰为private。
内部类初始化方式与其他类的初始化方式相同,都是使用new关键字。
class OuterClass{ //外部类
class InnerClass{ //内部类
}
}
在成员内部类中可以随意使用外部类的成员方法及成员变量,尽管这些类成员被修饰为private。
内部类初始化方式与其他类的初始化方式相同,都是使用new关键字。
public class Car {//创建汽车类
private String brand;//汽车品牌
public Car(String brand) {//汽车类的构造方法,参数为汽车品牌
this.brand = brand;//给汽车品牌赋值
}
class Engine{//发动机类(内部类)
String model;//发动机型号
public Engine(String model) {//发动机类的构造方法,参数为发动机型号
this.model=model;//给发动机型号赋值
}
public void ignite() {//(发动机)点火方法
System.out.println("发动机"+this.model+"点火");
}
}
public void start() {//启动(汽车)方法
System.out.println("启动"+this.brand);
}
public static void main(String[] args) {
Car car=new Car("大众朗行");//创建汽车类对象,并为汽车品牌赋值
car.start();//汽车类对象调用启动(汽车)方法
//常见发动机类(内部类)对象,并为发动机型号赋值
Car.Engine engine=car.new Engine("EA211");
engine.ignite();//发动机类对象调用(发动机)点火方法
}
}
private String brand;//汽车品牌
public Car(String brand) {//汽车类的构造方法,参数为汽车品牌
this.brand = brand;//给汽车品牌赋值
}
class Engine{//发动机类(内部类)
String model;//发动机型号
public Engine(String model) {//发动机类的构造方法,参数为发动机型号
this.model=model;//给发动机型号赋值
}
public void ignite() {//(发动机)点火方法
System.out.println("发动机"+this.model+"点火");
}
}
public void start() {//启动(汽车)方法
System.out.println("启动"+this.brand);
}
public static void main(String[] args) {
Car car=new Car("大众朗行");//创建汽车类对象,并为汽车品牌赋值
car.start();//汽车类对象调用启动(汽车)方法
//常见发动机类(内部类)对象,并为发动机型号赋值
Car.Engine engine=car.new Engine("EA211");
engine.ignite();//发动机类对象调用(发动机)点火方法
}
}
成员内部类不止可以在外部类中使用,在其他类中也可以使用。在其他类中创建内部类对象的语法非常特殊,语法如下:
外部类 outer = new 外部类();
外部类.内部类 inner = outer.new 内部类();
外部类 outer = new 外部类();
外部类.内部类 inner = outer.new 内部类();
匿名内部类
匿名类是只在创建对象时才会编写类体的一种写法 。匿名类的特点是”现用现写“,其语法如下:
new 父类/父接口(){
子类实现的内容
};
new 父类/父接口(){
子类实现的内容
};
abstract class Dog{
String Color;
public abstract void move();
public abstract void call();
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog maomao=new Dog() {
public void move() {
System.out.println("四条腿狂奔");
}
public void call() {
System.out.println("嗷呜~");
}
};
maomao.Color="灰色";
maomao.move();
maomao.call();
}
}
String Color;
public abstract void move();
public abstract void call();
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog maomao=new Dog() {
public void move() {
System.out.println("四条腿狂奔");
}
public void call() {
System.out.println("嗷呜~");
}
};
maomao.Color="灰色";
maomao.move();
maomao.call();
}
}
使用匿名类时应该遵循以下原则:
1、匿名类不能写构造方法
2、匿名类不能定义静态的成员
3、如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用完一次就会被Java虚拟机销毁
1、匿名类不能写构造方法
2、匿名类不能定义静态的成员
3、如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用完一次就会被Java虚拟机销毁
异常处理
异常概述
在Java中,这种在程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
在程序运行的过程中,也会发生各种非正常状况,比如程序运行时磁盘空间不足、网络连接中断、被装载的类不存在等。针对这种情况,在Java语言中,引入了异常,以异常类的形式对这些非正常情况进行封装,通过异常处理机制对程序运行时发生的各种问题进行处理。
异常地抛出与捕捉
抛出异常
异常抛出后,如果不做任何处理,程序就会被终止。例如,将一个字符串转换为整型。可以通过Integer类的 parseInt(方法来实现。但如果该字符串不是数字形式,parseInt)方法就会抛出异常,程序将在出现异常的位置终止,不再执行下面的语句。
捕捉异常
Java语言的异常捕获结构有try、catch和finally3种部分组成。其中,try语句块存放的是可能发生异常的Java语句;catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。语法如下:
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
...
finally{
//程序代码块
}
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
...
finally{
//程序代码块
}
Java语言的异常捕获结构有try、catch和finally3种部分组成。其中,try语句块存放的是可能发生异常的Java语句;catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。语法如下:
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
...
finally{
//程序代码块
}
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
...
finally{
//程序代码块
}
其中在try代码块中编写可能发生异常的Java语句,catch代码块中编写针对异常进行处理的代码。当try代码块中的程序发生了异常,系统会将这个异常的信息封装成一个异常对象,并将这个对象传递给catch代码块。catch代码块需要一个参数指明它所能够接收的异常类型,这个参数的类型必须是Exception类或其子类。
Java常见的异常类
在 Java中,提供了一些异常类用来描述经常发生的异常。其中,有的需要程序员进行捕获处理声明抛出,有的是由Java 虚拟机自动进行捕获处理。Java 中常见的异常类如表:
自定义异常
使用 Java 内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需继承Exception类即可自定义异常类。在程序中使用自定义异常类,大体可分为以下几个步骤:
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用 try-catch 语句块捕获并处理,否则在方法的声明处通过 throws 关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常的方法的调用者中捕获并处理异常。
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用 try-catch 语句块捕获并处理,否则在方法的声明处通过 throws 关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常的方法的调用者中捕获并处理异常。
如何创建自定义异常
//创建异常
public class MyException extends Exception{//创建自定义异常,继承Exception类
public MyException(String message) {//构造方法
super(message);//父类构造方法
}
}
public class MyException extends Exception{//创建自定义异常,继承Exception类
public MyException(String message) {//构造方法
super(message);//父类构造方法
}
}
自定义异常的抛出与捕捉
//使用异常
public class Tran {//创建类
static int avg(int num1,int num2) throws MyException{//定义方法,抛出异常
if (num1<0 ||num2<0) { //判断方法中参数是否满足指定条件
System.out.println("存在负数 ,无法计算");
throw new MyException("存在负数 ,无法计算");//错误信息
}
if (num1>100 ||num2>100) { //判断方法中参数是否满足指定条件
System.out.println("大于一百 ,无法计算");//错误信息
}
return(num1+num2)/2; //将参数的平均值返回
}
public static void main(String[] args) { //主方法
try { //try语句块处理可能出现异常的代码
int result=avg(-32,56); //调用AVG()方法
System.out.println(result); //将AVG()方法的返回值输出
}catch (MyException e) {
System.out.println(e); //输出异常信息
}
}
}
public class Tran {//创建类
static int avg(int num1,int num2) throws MyException{//定义方法,抛出异常
if (num1<0 ||num2<0) { //判断方法中参数是否满足指定条件
System.out.println("存在负数 ,无法计算");
throw new MyException("存在负数 ,无法计算");//错误信息
}
if (num1>100 ||num2>100) { //判断方法中参数是否满足指定条件
System.out.println("大于一百 ,无法计算");//错误信息
}
return(num1+num2)/2; //将参数的平均值返回
}
public static void main(String[] args) { //主方法
try { //try语句块处理可能出现异常的代码
int result=avg(-32,56); //调用AVG()方法
System.out.println(result); //将AVG()方法的返回值输出
}catch (MyException e) {
System.out.println(e); //输出异常信息
}
}
}
在方法中抛出异常
throws关键词通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可使用逗号隔开。
throws关键字声明抛出异常的语法格式如下:
修饰符 返回值类型 方法名([参数1,参数2....])throws ExcepsionTypel[,ExceptionType2.....]{
}
修饰符 返回值类型 方法名([参数1,参数2....])throws ExcepsionTypel[,ExceptionType2.....]{
}
从上述语法格式中可以看出,throws关键字需要写在方法声明的后面,throws后面需要声明方法中发生异常的类型,通常将这种做法称为方法声明抛出一个异常。
使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
运行时异常
在实际开发中,经常会在程序编译时产生一些异常,而这些异常必须要进行处理,这种异常被称为编译时异常,也称为checked异常。另外还有一种异常是在程序运行时产生的,这种异常即使不编写异常处理代码,依然可以通过编译因此被称为运行时异常,也称为unchecked异常。
1.编译时异常
在Java中,Exception类中除了RuntimeException类及其子类都是编译时异常。编方译时异常的特点是Java编译器会对其进行检查,如果出现异常就必须对异常进行处理,否则程序无法通过编译。处理编译时期的异常有两种方式:
使用try...catch语句对异常进行捕获
使用throws关键字声明抛出异常,调用者对其处理。
在Java中,Exception类中除了RuntimeException类及其子类都是编译时异常。编方译时异常的特点是Java编译器会对其进行检查,如果出现异常就必须对异常进行处理,否则程序无法通过编译。处理编译时期的异常有两种方式:
使用try...catch语句对异常进行捕获
使用throws关键字声明抛出异常,调用者对其处理。
2.运行时异常
RuntimeException类及其子类都是运行时异常。运行时异常的特点是Java编译器不会对其进行检查,也就是说,当程序中出现这类异常时,即使没有使用try..catch语句捕获或使用throws关键字声明抛出,程序也能编译通过。运行时异常一般是由程序中的逻辑错误引起的,在程序运行时无法恢复。比如通过数组的角标访问数组的元素时,如果超过了数组的最大角标,就会发生运行时异
常,代码如下所示:
int[] arr=new int[5];
System.out.println(arr[6]);
上面代码中,由于数组arr的length为5,最大角标应为4,当使用arr[6]访问数组中的元素就会发生数组角标越界的异常。
RuntimeException类及其子类都是运行时异常。运行时异常的特点是Java编译器不会对其进行检查,也就是说,当程序中出现这类异常时,即使没有使用try..catch语句捕获或使用throws关键字声明抛出,程序也能编译通过。运行时异常一般是由程序中的逻辑错误引起的,在程序运行时无法恢复。比如通过数组的角标访问数组的元素时,如果超过了数组的最大角标,就会发生运行时异
常,代码如下所示:
int[] arr=new int[5];
System.out.println(arr[6]);
上面代码中,由于数组arr的length为5,最大角标应为4,当使用arr[6]访问数组中的元素就会发生数组角标越界的异常。
异常的使用原则
Java 异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:
在当前方法声明中使用ty-catch语句捕获异常。
一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。
文章知识点与官方知识档案匹配,可进一步学习相关知识
在当前方法声明中使用ty-catch语句捕获异常。
一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。
文章知识点与官方知识档案匹配,可进一步学习相关知识
字符串
String类
声明字符串
在Java语言中,字符串必须包含在一对双引号(" ")之内。例如:
"23.23"、"ABCDE"、"您好"
可以通过以下语法格式来声明字符串变量:
String str;
String:指定该变量为字符串类型
str:任意有效的标识符,表示字符串变量的名称
声明字符串变量s,代码如下:
String s;
"23.23"、"ABCDE"、"您好"
可以通过以下语法格式来声明字符串变量:
String str;
String:指定该变量为字符串类型
str:任意有效的标识符,表示字符串变量的名称
声明字符串变量s,代码如下:
String s;
创建字符串
在Java语言中,将字符串作为对象来处理,因此可以像创建其他类型对象一样来创建字符串对象。创建对象要使用类的构造方法。
1. String(char a[])
该方法用一个字符数组a创建 String 对象,代码如下:
char a[ ] = {'g','o','o','d'};
String s = new String(a);等价于 String s = new String("good")
该方法用一个字符数组a创建 String 对象,代码如下:
char a[ ] = {'g','o','o','d'};
String s = new String(a);等价于 String s = new String("good")
2. String(char a[],int offset,int length)
该方法提取字符数组 a 中的一部分创建一个字符串对象。参数 ofset 表示开始截取字符串的位置length 表示截取字符串的长度。代码如下:
char a[] ={ 's','t','u','d','e','n','t'};
String s = new String(a,2,4);等价于 String s = new String("uden");
该方法提取字符数组 a 中的一部分创建一个字符串对象。参数 ofset 表示开始截取字符串的位置length 表示截取字符串的长度。代码如下:
char a[] ={ 's','t','u','d','e','n','t'};
String s = new String(a,2,4);等价于 String s = new String("uden");
3. String(char[] value)
该构造方法可分配一个新的 String 对象,使其表示字符数组参数中所有元素连接的结果。代码如下:
char a[]={'s','t','u','d','e','n','t'};
String s = new String(a);等价于 String s = new String("student");
该构造方法可分配一个新的 String 对象,使其表示字符数组参数中所有元素连接的结果。代码如下:
char a[]={'s','t','u','d','e','n','t'};
String s = new String(a);等价于 String s = new String("student");
连接字符串
连接多个字符串
使用”+“运算符可实现连接多个字符串的功能。”+“运算符可以连接多个String对象并产生一个新的String对象。
public class Test1{//创建类
public static void main(String args[]) {//主方法
String s1=new String("春色绿千里");//声明String对象s1
String s2=new String("马蹄香万家");//声明String对象s2
String s=s1+"\n"+s2;//将对象s1、"\n"和对象s2连接并将结果赋值给s
System.out.println(s);//将s输出
}
}
public static void main(String args[]) {//主方法
String s1=new String("春色绿千里");//声明String对象s1
String s2=new String("马蹄香万家");//声明String对象s2
String s=s1+"\n"+s2;//将对象s1、"\n"和对象s2连接并将结果赋值给s
System.out.println(s);//将s输出
}
}
连接其他数据类型
字符串也可以同其他基本类型进行连接。如果将字符串同其他数据类型数据进行连接,会将其他数据类型的数据直接转换成字符串。
public class Test1{
public static void main(String args[]) {
int booktime=4;
float practice=2.5f;
//将字符串与整型、浮点型变量相连接,并将结果输出
System.out.println("我每天花费"+booktime+"小时看书;"+practice+"小时上机练习");
}
}
public static void main(String args[]) {
int booktime=4;
float practice=2.5f;
//将字符串与整型、浮点型变量相连接,并将结果输出
System.out.println("我每天花费"+booktime+"小时看书;"+practice+"小时上机练习");
}
}
案例实现的是将字符串常量与整型变量booktime和浮点型变量practice相连后的结果输出。在这里booktime和practice都不是字符串,当它们与字符串相连时会自动调用tostring()方法并转换成字符串形式,然后参与字符串连接。
如果将上例中的输出语句修改为:
System.out.println("我每天花费"+booktime+"小时看书;"+(practice+booktime)+"小时上机练习"); 这是由于运算符是有优先级的,圆括号的优先级最高,所以先被执行,然后再将结果与字符串相连。
如果将上例中的输出语句修改为:
System.out.println("我每天花费"+booktime+"小时看书;"+(practice+booktime)+"小时上机练习"); 这是由于运算符是有优先级的,圆括号的优先级最高,所以先被执行,然后再将结果与字符串相连。
获取字符串信息
获取字符串长度
使用String类的length()方法可获取声明的字符串对象的长度。语法如下:
str.length();
其中,str为字符串对象。
获取字符串长度,代码如下:
String str = "We are students";
int size = str.length();
上段代码是将字符串 sr 的长度值给 in 型变量 size,此时变量 size 的值为 15,这表示 ngth方法返回的字符串的长度(包括字符串中的空格)。
str.length();
其中,str为字符串对象。
获取字符串长度,代码如下:
String str = "We are students";
int size = str.length();
上段代码是将字符串 sr 的长度值给 in 型变量 size,此时变量 size 的值为 15,这表示 ngth方法返回的字符串的长度(包括字符串中的空格)。
字符串查找
String类提供了两种查找字符串的方法,即indexOf()与lastIndexOf()方法。这两种方法都允许在字符串中搜索指定条件的字符或字符串。indexOf()方法返回的是搜索的字符或字符串首次出现的位置。
1. indexOf(substr)
该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。当调用 String 类的indexOfr方法时,会从当前字符串的开始位置搜索 s 的位置。如果没有检索到字符串 s,该方法的返回值是-1.语法如下:
indexOf(substr)
str:任意字符串对象
substr:要搜索的字符串
查找字符a 在字符串 str 中的索引位置,代码如下:
String str = "We are students";
int size = str.indexOf("a"); //变量 size 的值是3
理解字符串的索引位置,要对字符串的下标有所了解。在 Java 语言中,String 对象是用数组表示的。字符串的下标是0~length0-1。
该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。当调用 String 类的indexOfr方法时,会从当前字符串的开始位置搜索 s 的位置。如果没有检索到字符串 s,该方法的返回值是-1.语法如下:
indexOf(substr)
str:任意字符串对象
substr:要搜索的字符串
查找字符a 在字符串 str 中的索引位置,代码如下:
String str = "We are students";
int size = str.indexOf("a"); //变量 size 的值是3
理解字符串的索引位置,要对字符串的下标有所了解。在 Java 语言中,String 对象是用数组表示的。字符串的下标是0~length0-1。
2. lastindexOf(String str)
该方法用于返回指定字符中最后一次出现的索引位置。当调用 Sting 类的 lastindexOf0方法时,会从当前字符串的开始位置检索参数字符串 ,并将最后一次出现。的聚引位置运回。如果没有检索到字符巾 str,该方法返回-1。语法如下:
str.lastIndexof(substr)
str:任意字符串对象
substr:要搜索的字符串
该方法用于返回指定字符中最后一次出现的索引位置。当调用 Sting 类的 lastindexOf0方法时,会从当前字符串的开始位置检索参数字符串 ,并将最后一次出现。的聚引位置运回。如果没有检索到字符巾 str,该方法返回-1。语法如下:
str.lastIndexof(substr)
str:任意字符串对象
substr:要搜索的字符串
public class Test1{
public static void main(String args[]) {
String str="We are students";//定义字符串str
int size=str.lastIndexOf("");//将空字符串在str中的索引位置赋值给变量size
System.out.println("空字符串在字符串str中的索引位置是:"+size);//将变量size输出
System.out.println("字符串str的长度是:"+str.length());//将字符串str的长度输出
}
}
public static void main(String args[]) {
String str="We are students";//定义字符串str
int size=str.lastIndexOf("");//将空字符串在str中的索引位置赋值给变量size
System.out.println("空字符串在字符串str中的索引位置是:"+size);//将变量size输出
System.out.println("字符串str的长度是:"+str.length());//将字符串str的长度输出
}
}
获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回。
//获取指定索引号的字符
char charAt=str.charAt(3);
System.out.println(charAt);
//获取指定索引号的字符
char charAt=str.charAt(3);
System.out.println(charAt);
public class Test1{
public static void main(String args[]) {
String str="hello world";//定义字符串str
char mychar=str.charAt(6);//将字符串str中索引位置是6的字符返回
System.out.println("字符串str中索引位置是6的字符为:"+mychar);//输出信息
}
}
public static void main(String args[]) {
String str="hello world";//定义字符串str
char mychar=str.charAt(6);//将字符串str中索引位置是6的字符返回
System.out.println("字符串str中索引位置是6的字符为:"+mychar);//输出信息
}
}
字符串操作
获取子字符串
通过String类的substring0方法可对字符串进行截取。substring0方法被两种不同的重载形式,来满足不同的需要。这些形式的共同点就是都利用字符串的下标进行截取,且应明确字符串下标是从0开始的。
1. substring(int beginlndex)
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串。语法如下.:
str.substring(int beginlndex)
其中,beginIndex 指定从某一索引处开始截取字符串。
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串。语法如下.:
str.substring(int beginlndex)
其中,beginIndex 指定从某一索引处开始截取字符串。
2. substring(int beginlndex,int endlndex)
该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串。语法如下:
substring(int beginindex, int endindex)
beginIndex:开始截取子字符串的索引位置。
endIndex:子字符串在整个字符串中的结束位置。
该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串。语法如下:
substring(int beginindex, int endindex)
beginIndex:开始截取子字符串的索引位置。
endIndex:子字符串在整个字符串中的结束位置。
public class Test1{
public static void main(String args[]) {
String str="《将进酒》:李白(唐)";//定义的字符串
String substr=str.substring(6,8);//对字符串进行截取
System.out.println("《将进酒》的作者是"+substr);//输出截取后的字符串
}
}
public static void main(String args[]) {
String str="《将进酒》:李白(唐)";//定义的字符串
String substr=str.substring(6,8);//对字符串进行截取
System.out.println("《将进酒》的作者是"+substr);//输出截取后的字符串
}
}
去除空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格,语法如下:
str.trim()
str.trim()
public class Test1{
public static void main(String args[]) {
String str=" Java class ";//定义字符串str
System.out.println("字符串原来的长度:"+str.length());//将str原来的长度输出
//将str去掉前导和尾部的空格后的长度输出
System.out.println("去掉空格后的长度:"+str.trim().length());
}
}
public static void main(String args[]) {
String str=" Java class ";//定义字符串str
System.out.println("字符串原来的长度:"+str.length());//将str原来的长度输出
//将str去掉前导和尾部的空格后的长度输出
System.out.println("去掉空格后的长度:"+str.trim().length());
}
}
字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串,语法如下:
str.replace(CharSequence target,CharSequence replacement)
target:要替换的字符或字符串
replacement:用于替换原来字符串的内容
str.replace(CharSequence target,CharSequence replacement)
target:要替换的字符或字符串
replacement:用于替换原来字符串的内容
public class Test1{
public static void main(String args[]) {
String str="address";//定义字符串str
String newstr=str.replace("a","A");//将str中“a”替换成"A"并返回新字符串newstr
System.out.println(newstr);//将字符串newstr输出
}
}
public static void main(String args[]) {
String str="address";//定义字符串str
String newstr=str.replace("a","A");//将str中“a”替换成"A"并返回新字符串newstr
System.out.println(newstr);//将字符串newstr输出
}
}
判断字符串的开始与结尾
startsWit()方法与endsWith()方法分别用于判断字符串是否以指定的内容开始或结束。这两个方法的返回值都为 boolean类型。
1. startsWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:
str.startsWith(String prefix)
prefix:作为前缀的字符串
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:
str.startsWith(String prefix)
prefix:作为前缀的字符串
2. endWith()方法
该方法用于判断当前字符串是否为以给定的字符串结束。语法如下:
str.endsWith(String suffix)
suffix:作为后缀的字符串
该方法用于判断当前字符串是否为以给定的字符串结束。语法如下:
str.endsWith(String suffix)
suffix:作为后缀的字符串
public class Test1{
public static void main(String args[]) {
String num1="22045612";//定义字符串num1
String num2="21304578";//定义字符串num2
boolean b=num1.startsWith("22");//判断字符串num1是否以‘22’开头
boolean b1=num2.endsWith("78");//判断字符串num1是否以‘78’结束
System.out.println("字符串num1是以‘22’开始的吗?"+b);
System.out.println("字符串num2以‘78’结束的吗?"+b1);//输出信息
}
}
public static void main(String args[]) {
String num1="22045612";//定义字符串num1
String num2="21304578";//定义字符串num2
boolean b=num1.startsWith("22");//判断字符串num1是否以‘22’开头
boolean b1=num2.endsWith("78");//判断字符串num1是否以‘78’结束
System.out.println("字符串num1是以‘22’开始的吗?"+b);
System.out.println("字符串num2以‘78’结束的吗?"+b1);//输出信息
}
}
判断字符串是否相等
对字符对象进行不能简单地使用比较运算符“==”,因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍然会返回。
要比较两个字符串内容是相同相等,应使用equals()方法和equalsIgnoreCase()方法 。
要比较两个字符串内容是相同相等,应使用equals()方法和equalsIgnoreCase()方法 。
1. equals()方法
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则false。语法如下:
str.equlas(String otherstr)
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则false。语法如下:
str.equlas(String otherstr)
2. equalslgnoreCase方法
使用equlas()方法对字符串进行比较时是区分大小写的,而使用equalsIgnoreCase()方法是在忽略了大小写的情况下比较两个字符串是否相等,返回结果仍然为boolean类型。语法如下:
str.equalsIgnoreCase(String otherstr)
使用equlas()方法对字符串进行比较时是区分大小写的,而使用equalsIgnoreCase()方法是在忽略了大小写的情况下比较两个字符串是否相等,返回结果仍然为boolean类型。语法如下:
str.equalsIgnoreCase(String otherstr)
public class Test1{
public static void main(String args[]) {
String s1=new String("abc");//创建字符串对象s1
String s2=new String("ABC");//创建字符串对象s2
boolean b=s1.equals(s2);//使用equals()方法比较s1与s2
boolean b1=s1.equalsIgnoreCase(s2);//使用equalsIgnoreCase()方法比较s1与s2
System.out.println(s1+"equals"+s2+":"+b);
System.out.println(s1+"equalsIgnoreCase"+s2+":"+b1);
}
}
public static void main(String args[]) {
String s1=new String("abc");//创建字符串对象s1
String s2=new String("ABC");//创建字符串对象s2
boolean b=s1.equals(s2);//使用equals()方法比较s1与s2
boolean b1=s1.equalsIgnoreCase(s2);//使用equalsIgnoreCase()方法比较s1与s2
System.out.println(s1+"equals"+s2+":"+b);
System.out.println(s1+"equalsIgnoreCase"+s2+":"+b1);
}
}
按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符串的Unicode值,按照字典顺序将String对象表示的字符序列与参数字符串所表示的字符序列进行比较。语法如下:
str.compareTo(String otherstr)
str.compareTo(String otherstr)
public class Test1{
public static void main(String args[]) {
//用于比较的3个字符串
String str=new String("b");
String str2=new String("a");
String str3=new String("c");
System.out.println(str+"compareTo"+str2+":"+str.compareTo(str2));//将str与str2比较的结果输出
System.out.println(str+"compareTo"+str3+":"+str.compareTo(str3));//将str与str2比较的结果输出
}
}
public static void main(String args[]) {
//用于比较的3个字符串
String str=new String("b");
String str2=new String("a");
String str3=new String("c");
System.out.println(str+"compareTo"+str2+":"+str.compareTo(str2));//将str与str2比较的结果输出
System.out.println(str+"compareTo"+str3+":"+str.compareTo(str3));//将str与str2比较的结果输出
}
}
字母大小写转换
String类的toLowerCase()方法可将字符串中的所有大写字母改写为小写字母,而toUpperCase()方法可将字符串中的所有小写字母改为大写字母。
1、toLowerCase()方法
如果字符串中没有应该被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个大写字母都转换成小写,字符串长度不变。语法如下:
str.toLower()
如果字符串中没有应该被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个大写字母都转换成小写,字符串长度不变。语法如下:
str.toLower()
2、 toUpperCase()方法
如果字符串中没有应该被转换的字符,则将原字符串返回;否则返回一个新字符串,将原字符串中每个小写字母都转换成大写,字符串长度不变,语法如下:
str. toUpperCase()
如果字符串中没有应该被转换的字符,则将原字符串返回;否则返回一个新字符串,将原字符串中每个小写字母都转换成大写,字符串长度不变,语法如下:
str. toUpperCase()
public class Test1{
public static void main(String args[]) {
String str=new String("oh My God");//创建字符串str
String newstr=str.toLowerCase();//使用toLowerCase()方法实行小写转换
String newstr2=str.toUpperCase();//使用toUpperCase()方法实行小写转换
System.out.println(newstr);
System.out.println(newstr2);
}
}
public static void main(String args[]) {
String str=new String("oh My God");//创建字符串str
String newstr=str.toLowerCase();//使用toLowerCase()方法实行小写转换
String newstr2=str.toUpperCase();//使用toUpperCase()方法实行小写转换
System.out.println(newstr);
System.out.println(newstr2);
}
}
字符串分割
使用split()方法可以使字符串按指定的分割线字符或字符串进行分割,并将分割后的结果存放在字符串数组中。split()方法提供了以下两种字符串分割形式。
1. split(String sign)
该方法可根据给定的分隔符对字符串进行拆分。语法如下:
str.split(String sign)
该方法可根据给定的分隔符对字符串进行拆分。语法如下:
str.split(String sign)
2. split(String sign,int limit)
该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数。语法如下:
str.split(String sign,int limit)
sign:分割字符串的分割符,也可以使用正则表达式
limit:限制的分割次数
该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数。语法如下:
str.split(String sign,int limit)
sign:分割字符串的分割符,也可以使用正则表达式
limit:限制的分割次数
public class Test1{
public static void main(String args[]) {
String str="192.168.0.1";
String[]firstArray=str.split("\\.");//按照”.“进行分割,使用转义字符串”\\.“
String[]secondArray=str.split("\\.",2);//按照”.“进行两次分割,使用转义字符串”\\.“
System.out.println("str的原值为:["+str+"]");//输出str原值
System.out.print("全部分割的结果:");//输出全部分割的结果
for(String a:firstArray) {
System.out.print("["+a+"]");
}
System.out.println();//换行
System.out.print("分割两次的结果:");
for(String a:secondArray) {
System.out.print("["+a+"]");
}
System.out.println();
}
}
public static void main(String args[]) {
String str="192.168.0.1";
String[]firstArray=str.split("\\.");//按照”.“进行分割,使用转义字符串”\\.“
String[]secondArray=str.split("\\.",2);//按照”.“进行两次分割,使用转义字符串”\\.“
System.out.println("str的原值为:["+str+"]");//输出str原值
System.out.print("全部分割的结果:");//输出全部分割的结果
for(String a:firstArray) {
System.out.print("["+a+"]");
}
System.out.println();//换行
System.out.print("分割两次的结果:");
for(String a:secondArray) {
System.out.print("["+a+"]");
}
System.out.println();
}
}
格式化字符串
日期和时间字符串格式化
在应用程序设计中,经常需要显示日期和时间。如果想输出满意的日期和时间格式化,一般需要编写大量的代码、经过各种算法才能实现。format()方法通过给定的特殊转换符作为参数来实现对日期和时间的格式化。
1. 日期格式化
先来看一个例子。返回一个月中的天数,代码如下:
Date date=new Date();//创建Date对象date
Stirng s=String.format("%te",date);//通过format()方法date进行格式化
先来看一个例子。返回一个月中的天数,代码如下:
Date date=new Date();//创建Date对象date
Stirng s=String.format("%te",date);//通过format()方法date进行格式化
2. 时间格式化
使用format()方法不仅可以完成日期的格式化,也可以实现时间格式化。时间的格式化转换符要比日期的格式化转换符更多、更精确,它可以将时间格式化为时、分、秒、毫。
格式化时间的转换符如图所示
使用format()方法不仅可以完成日期的格式化,也可以实现时间格式化。时间的格式化转换符要比日期的格式化转换符更多、更精确,它可以将时间格式化为时、分、秒、毫。
格式化时间的转换符如图所示
3. 格式化常见的日期时间组合
格式化日期与时间组合的转换符定义了各种日期时间组合的格式,其中最常见的如图所示
格式化日期与时间组合的转换符定义了各种日期时间组合的格式,其中最常见的如图所示
常规类型格式化
常规类型格式化可应用于任何参数类型,如图所示:
使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一个格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的云字符。
正则表达式元字符及其意义如图所示:
正则表达式元字符及其意义如图所示:
在正则表达式中,可以使用方括号括起着于个字符来表示一个元字符,该元字符可代表方精号中
第任同一个字符。例如,B一“labc14",这样字符 4、b4、c4 都是和正则表达式匹配的字等事号书括号元字符还可以为其他格式,如:
[456]:代表4、5、6之外的任何字符。
[a-r]: 代表 a~r中的任何一个字母。
[a-ZA-Z]:可表示任意一个英文字母。
[a-e[g-z]]: 代表a~e或 g~z 中的任何一个字母(并运算)。
[a-o&&[def]:代表字母 d、e、f (交运算)。
[a-d&&[^bc]]:代表字母 a、d(差运算)。
第任同一个字符。例如,B一“labc14",这样字符 4、b4、c4 都是和正则表达式匹配的字等事号书括号元字符还可以为其他格式,如:
[456]:代表4、5、6之外的任何字符。
[a-r]: 代表 a~r中的任何一个字母。
[a-ZA-Z]:可表示任意一个英文字母。
[a-e[g-z]]: 代表a~e或 g~z 中的任何一个字母(并运算)。
[a-o&&[def]:代表字母 d、e、f (交运算)。
[a-d&&[^bc]]:代表字母 a、d(差运算)。
字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+"可达达到附近新字符或字符串的目的,但”+“会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复对字符串进行修改,将极大地增加系统开销。
public class Test2{
public static void main(String[] args) {
String str="";//创建空字符串
long starTime=System.currentTimeMillis();//定义对字符串执行操作的起始时间
for(int i=0;i<10000;i++) {//利用for循环执行10000操作
str=str+i;//循环追加字符
}
long endTime=System.currentTimeMillis();
long time=endTime-starTime;//计算对字符串执行操作的时间
System.out.println("String消耗时间:"+time);//将执行的时间输出
StringBuilder builder=new StringBuilder("");//创建字符串生成器
starTime=System.currentTimeMillis();//更新操作执行前的时间
for(int j=0;j<10000;j++) {//利用for循环进行操作
builder.append(j);//循环追加字符
}
endTime=System.currentTimeMillis();//更新操作后的时间
time=endTime-starTime;//更新追加操作执行时间
System.out.println("StringBuilder消耗时间:"+time);//将操作时间输出
}
}
public static void main(String[] args) {
String str="";//创建空字符串
long starTime=System.currentTimeMillis();//定义对字符串执行操作的起始时间
for(int i=0;i<10000;i++) {//利用for循环执行10000操作
str=str+i;//循环追加字符
}
long endTime=System.currentTimeMillis();
long time=endTime-starTime;//计算对字符串执行操作的时间
System.out.println("String消耗时间:"+time);//将执行的时间输出
StringBuilder builder=new StringBuilder("");//创建字符串生成器
starTime=System.currentTimeMillis();//更新操作执行前的时间
for(int j=0;j<10000;j++) {//利用for循环进行操作
builder.append(j);//循环追加字符
}
endTime=System.currentTimeMillis();//更新操作后的时间
time=endTime-starTime;//更新追加操作执行时间
System.out.println("StringBuilder消耗时间:"+time);//将操作时间输出
}
}
1. append()方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如int、boolean、char、String、double或者另一个字符串生成器等。语法如下:
append(content)
content:追加到字符串 生成器中的内容
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如int、boolean、char、String、double或者另一个字符串生成器等。语法如下:
append(content)
content:追加到字符串 生成器中的内容
2. insert(int offset,arg)方法
该方法用于向字符串生成器中指定位置插入数据内容。通过该方法的不同重载形式,课实现向字符串生成器中插入int、flaot、char和boolean等基本数据类型的数据或其他对象。语法如下:
insert(int offset,arg)
offset:字符串生成器的位置
args:将插入至字符串生成器的位置
向字符串生成器中指定的位置添加字符,代码如下:
StringBuilder bf = new StringBuilder("hello");//创建字符生成器
bf.insert(5, "world");//添加至字符生成器的位置及内容
System.out.printin(bf.toString());//此时输出信息为 helloworld
该方法用于向字符串生成器中指定位置插入数据内容。通过该方法的不同重载形式,课实现向字符串生成器中插入int、flaot、char和boolean等基本数据类型的数据或其他对象。语法如下:
insert(int offset,arg)
offset:字符串生成器的位置
args:将插入至字符串生成器的位置
向字符串生成器中指定的位置添加字符,代码如下:
StringBuilder bf = new StringBuilder("hello");//创建字符生成器
bf.insert(5, "world");//添加至字符生成器的位置及内容
System.out.printin(bf.toString());//此时输出信息为 helloworld
3. delet(int start.int end)方法
移除此序列的字符串中的字符。该字符串从指定的start处开始,一直到索引end-1处的字符。如果不存在这种字符,则一直到序列尾部。如果start等于end,则不发生任何更改。语法如下:
delet(int start.int end)
start:将要删除的字符串的起
end:将要删除的字符的终点位置。
删除指定位置的子字符串,代码如下:
StringBuilder bf = new StringBuilder("StringBuilder");//创建字符串生成器
bf.delete(5.10);//删除的子字符串
System.out.println(bf.toString());//此时输出的信息为 Strinder
移除此序列的字符串中的字符。该字符串从指定的start处开始,一直到索引end-1处的字符。如果不存在这种字符,则一直到序列尾部。如果start等于end,则不发生任何更改。语法如下:
delet(int start.int end)
start:将要删除的字符串的起
end:将要删除的字符的终点位置。
删除指定位置的子字符串,代码如下:
StringBuilder bf = new StringBuilder("StringBuilder");//创建字符串生成器
bf.delete(5.10);//删除的子字符串
System.out.println(bf.toString());//此时输出的信息为 Strinder
常用数据库
包装类
为了能将基本数据类型视为对象进行处理,Java提出了包装类的概念,它主要是将基本数据类型封装在包装类中,如int型的包装类Integer、boolean型的包装类Boolean等,这样便可以把这些基本数据类型转换为对象进行处理。Java中的包装类及其对应的基本数据类型如下表:
Integer类
java.lang包中的Integer类、Byte类、Short类和Long类,分别将基本数据类型int、byte、short和long封装成一个类,由于这些类都是Number类的子类,区别就是封装不通过的数据类型,其包含的方法基本相同。
Integer类在对象中包装了一个基本数据类型int的值,该类的对象包含一个int类型的字段。此外,该类提供了多个方法,能在int类型和String类型之间互相转换,同时还提供了其他一些处理int类型时非常有用的常量和方法。Integer类的常用方法如下表:
Integer类在对象中包装了一个基本数据类型int的值,该类的对象包含一个int类型的字段。此外,该类提供了多个方法,能在int类型和String类型之间互相转换,同时还提供了其他一些处理int类型时非常有用的常量和方法。Integer类的常用方法如下表:
public class LntegerDemo { //创建类
public static void main(String[] args) { //主方法
int num = Integer.parseInt("456"); //将字符串转换为int类型
Integer iNum = Integer.valueOf("456"); //创建一个Integer对象
System.out.println("int数据与Integer对象的比较:" + iNum.equals(num)); //输出
String str2 = Integer.toBinaryString(num); //获取数字的二进制表示
String str3 = Integer.toHexString(num); //获取数字的十六进制表示
String str4 = Integer.toOctalString(num); //获取数字的八进制表示
String str5 = Integer.toString(num, 15); //获取数字的十五进制表示
//输出结果
System.out.println("456的二进制表示为:" + str2);
System.out.println("456的十六进制表示为:" + str3);
System.out.println("456的八进制表示为:" + str4);
System.out.println("456的十五进制表示为:" + str5);
}
}
public static void main(String[] args) { //主方法
int num = Integer.parseInt("456"); //将字符串转换为int类型
Integer iNum = Integer.valueOf("456"); //创建一个Integer对象
System.out.println("int数据与Integer对象的比较:" + iNum.equals(num)); //输出
String str2 = Integer.toBinaryString(num); //获取数字的二进制表示
String str3 = Integer.toHexString(num); //获取数字的十六进制表示
String str4 = Integer.toOctalString(num); //获取数字的八进制表示
String str5 = Integer.toString(num, 15); //获取数字的十五进制表示
//输出结果
System.out.println("456的二进制表示为:" + str2);
System.out.println("456的十六进制表示为:" + str3);
System.out.println("456的八进制表示为:" + str4);
System.out.println("456的十五进制表示为:" + str5);
}
}
Integer类提供了以下4个常量:
MAX_VALUE:表示int类型可取的最大值,即
MIN_VALUE:表示int类型可取的最小值,即
SIZE:用来以二进制补码形式表示int值的位数
TYPE:表示基本类型int的Class实例
MAX_VALUE:表示int类型可取的最大值,即
MIN_VALUE:表示int类型可取的最小值,即
SIZE:用来以二进制补码形式表示int值的位数
TYPE:表示基本类型int的Class实例
public class LntegerDemo { //创建类
public static void main(String[] args) { //主方法
int maxint = Integer.MAX_VALUE; //获取Integer类的常量值
int minint = Integer.MIN_VALUE;
int intsize =Integer.SIZE;
System.out.println("int类型可取的最大值是:" + maxint); //将常量值输出
System.out.println("int类型可取的最小值是:" + minint);
System.out.println("int类型的二进制位数是:" + intsize);
}
}
public static void main(String[] args) { //主方法
int maxint = Integer.MAX_VALUE; //获取Integer类的常量值
int minint = Integer.MIN_VALUE;
int intsize =Integer.SIZE;
System.out.println("int类型可取的最大值是:" + maxint); //将常量值输出
System.out.println("int类型可取的最小值是:" + minint);
System.out.println("int类型的二进制位数是:" + intsize);
}
}
Double类
Double类和Float 类是对 double、 float基本类型的封装,它们都是 Number 类的子类,都是对浮数进行操作,所以常用方法基本相同。
Double 类在对象中包装一个基本类型为 double 的值,每个 Double 类的对象都包含一个double类型的字段。此外,该类还提供多个方法,可以将 double 类型转换为 Sting 类型,将 String 类型转换为 double类型,也提供了其他一些处理 double 类型时有用的常量和方法。Double类的常用方法如下:
Double 类在对象中包装一个基本类型为 double 的值,每个 Double 类的对象都包含一个double类型的字段。此外,该类还提供多个方法,可以将 double 类型转换为 Sting 类型,将 String 类型转换为 double类型,也提供了其他一些处理 double 类型时有用的常量和方法。Double类的常用方法如下:
public class LntegerDemo { //创建类
public static void main(String[] args) { //主方法
Double dNum = Double.valueOf("3.14"); //创建一个Double对象
//判断是否为非数字值
System.out.println("3.14是否为非数字值:" + Double.isNaN(dNum.doubleValue()));
System.out.println("3.14是否为非数字值:" + dNum.intValue());
//判断大小
System.out.println("值为3.14的Double对象与3.14的比较结果:" + dNum.equals(3.14));
//转换为十六进制
System.out.println("3.14的十六进制表示为:" + Double.toHexString(dNum));
}
}
public static void main(String[] args) { //主方法
Double dNum = Double.valueOf("3.14"); //创建一个Double对象
//判断是否为非数字值
System.out.println("3.14是否为非数字值:" + Double.isNaN(dNum.doubleValue()));
System.out.println("3.14是否为非数字值:" + dNum.intValue());
//判断大小
System.out.println("值为3.14的Double对象与3.14的比较结果:" + dNum.equals(3.14));
//转换为十六进制
System.out.println("3.14的十六进制表示为:" + Double.toHexString(dNum));
}
}
Double类主要提供了以下常量:
MAX_EXPONENT:返回int值,表示有限double变量可能具有的最大指数 。
MIN_EXPONENT:返回int值,表示标准化double变量可能具有的最小指数 。
NEGATIVE_INFINITY:返回double值,表示保存double类型的负无穷大值的常量。
POSITIVE_INFIINITY:返回double值,表示保存double类型的正无穷大值的常量。
MAX_EXPONENT:返回int值,表示有限double变量可能具有的最大指数 。
MIN_EXPONENT:返回int值,表示标准化double变量可能具有的最小指数 。
NEGATIVE_INFINITY:返回double值,表示保存double类型的负无穷大值的常量。
POSITIVE_INFIINITY:返回double值,表示保存double类型的正无穷大值的常量。
Boolean类
Boolean类将基本类型为 boolean 的值包装在一个对象中。一个 Boolean类型的对象只包含一个类型为 boolean 的字段。此外,此类还为 boolean 类型和 String 类型的相互转换提供了许多方法,并提供了处理 boolean 类型时非常有用的其他一些常量和方法。Boolean类的常用方法如下表:
public class LntegerDemo { //创建类
public static void main(String[] args) { //主方法
Boolean b1 = Boolean.valueOf("true"); //创建Boolean对象
Boolean b2 = Boolean.valueOf("ok");
System.out.println("b1:" + b1.booleanValue()); //输出
System.out.println("b2:" + b2.booleanValue());
}
}
public static void main(String[] args) { //主方法
Boolean b1 = Boolean.valueOf("true"); //创建Boolean对象
Boolean b2 = Boolean.valueOf("ok");
System.out.println("b1:" + b1.booleanValue()); //输出
System.out.println("b2:" + b2.booleanValue());
}
}
Boolean 提供了以下3个常量:
TRUE:对应基值 true 的 Boolean 对象。
FALSE:对应基值false的 Boolean 对象。
TYPE:基本类型boolean的Class对象。
TRUE:对应基值 true 的 Boolean 对象。
FALSE:对应基值false的 Boolean 对象。
TYPE:基本类型boolean的Class对象。
Character类
Character类在对象中包装一个基本类型为char的值,该类提供了多种方法,以确定字符的类别(小写字母、数字等),并可以很方便地将字符从大写转换成小写,反之亦然。Character类提供了很多方法来完成对字符的操作,常用的方法如下表:
public class LntegerDemo { //创建类
public static void main(String[] args) { //主方法
Character mychar1 = Character.valueOf('A');
Character mychar2 = Character.valueOf('a');
if(Character.isUpperCase(mychar1)) { //判断是否为大写字母
System.out.println(mychar1 + "是大写字母");
//转换为小写并输出
System.out.println("转换为小写字母的结果:"+Character.toLowerCase(mychar1));
}
if(Character.isLowerCase(mychar2)) { //判断是否为小写字母
System.out.println(mychar2 + "是小写字母");
//转换为大写并输出
System.out.println("转换为大写字母的结果:"+Character.toUpperCase(mychar2));
}
}
}
public static void main(String[] args) { //主方法
Character mychar1 = Character.valueOf('A');
Character mychar2 = Character.valueOf('a');
if(Character.isUpperCase(mychar1)) { //判断是否为大写字母
System.out.println(mychar1 + "是大写字母");
//转换为小写并输出
System.out.println("转换为小写字母的结果:"+Character.toLowerCase(mychar1));
}
if(Character.isLowerCase(mychar2)) { //判断是否为小写字母
System.out.println(mychar2 + "是小写字母");
//转换为大写并输出
System.out.println("转换为大写字母的结果:"+Character.toUpperCase(mychar2));
}
}
}
Character 类提供了大量表示特定字符的常量,例如:
CONNECTOR_PUNCTUATION: 返回 byte 型值,表示 Unicode 规范中的常规类别“pe”。
UNASSIGNED: 返回 byte型值,表示 Unicode 规范中的常规类别“Cn”。
TITLECASE_LETTER:返回 byte 型值,表示Unicode 规范中的常规类别“Lt”。
CONNECTOR_PUNCTUATION: 返回 byte 型值,表示 Unicode 规范中的常规类别“pe”。
UNASSIGNED: 返回 byte型值,表示 Unicode 规范中的常规类别“Cn”。
TITLECASE_LETTER:返回 byte 型值,表示Unicode 规范中的常规类别“Lt”。
Number类
对于数值型的包装类,它们有一个共同的父类一Number 类,该类是一个抽象类,它是 Byte、Integer、Short、Long、Float 和 Double 类的父类,其子类必须提供将表示的数值转换为 byte、int、short、 long、float 和 double 的方法。例如,doubleValue0方法返回双精度浮点值,floatValue0方法返回单精度浮点值,这些方法如下表:
Number 类的方法分别被其各子类所实现,也就是说,在 Number 类的所有子类中都包含以上这几种方法。
数字处理
在 Java 语言中,提供了一个执行数学基本运算的 Math 类,该类包括常用的数学运算方法,如角函数方法、指数函数方法、对数函数方法、平方根函数方法等一些常用数学函数方法。除此之外还提供了一些常用的数学常量,如 PI、E 等。
在实际开发中,随机数的使用是很普遍的,所以要掌握生成随机数的操作。在Java 中主要提供]两种生成随机数的方式,分别为调用 Math 类的random()方法生成随机数和调用 Random 类生成各种整据类型的随机数。
在Java 中,还提供了大数字的操作类,即 java.math.BigInteger 类与java.math.BigDecimal类。这个类用于高精度计算,其中 BigInteger 类是针对大整数的处理类,而 BigDecimal类则是针对大小数的处理类。
在实际开发中,随机数的使用是很普遍的,所以要掌握生成随机数的操作。在Java 中主要提供]两种生成随机数的方式,分别为调用 Math 类的random()方法生成随机数和调用 Random 类生成各种整据类型的随机数。
在Java 中,还提供了大数字的操作类,即 java.math.BigInteger 类与java.math.BigDecimal类。这个类用于高精度计算,其中 BigInteger 类是针对大整数的处理类,而 BigDecimal类则是针对大小数的处理类。
数字格式化
数字格式化在解决实际问题时应用非常普遍,如表示某超市的商品价格,需要保留两位有效数字数字格式化操作主要针对的是浮点型数据,包括 double 型和 float 型数据。在 Java 中使用 java.textDecimalFormat格式化数字。
在 Java 中,没有格式化的数据遵循以下原则:
如果数据绝对值大于0.001并且小于10000000,使以常规小数形式表示。
如果数据绝对值小于0.001或者大于10000000,使用科学记数法表示。
由于上述输出格式不能满足解决实际问题的要求,通常将结果格式化为指定形式后输出。在 Jav中,可以使用DecimalFormat类进行格式化操作。
DecimalFormat类是NumberFormat 的一个子类,用于格式化十进制数字。它可以将一些数字格式化为整数、浮点数、百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的精度。一艘情况下,可以在实例化 DecimalFormat 对象时传递数字格式,也可以通过 DecimalFormat 类中applyPattern0方法来实现数字格式化。
在 Java 中,没有格式化的数据遵循以下原则:
如果数据绝对值大于0.001并且小于10000000,使以常规小数形式表示。
如果数据绝对值小于0.001或者大于10000000,使用科学记数法表示。
由于上述输出格式不能满足解决实际问题的要求,通常将结果格式化为指定形式后输出。在 Jav中,可以使用DecimalFormat类进行格式化操作。
DecimalFormat类是NumberFormat 的一个子类,用于格式化十进制数字。它可以将一些数字格式化为整数、浮点数、百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的精度。一艘情况下,可以在实例化 DecimalFormat 对象时传递数字格式,也可以通过 DecimalFormat 类中applyPattern0方法来实现数字格式化。
当格式化数字时,可在 DecimalFormat 类中使用一些特殊字符构成一个格式化模板,使数字按照定的特殊字符规则进行匹配。表 11.7 列举了格式化模板中的特殊字符及其所代表的含义。
Math类
Math 类提供了众多数学函数方法,主要包括三角函数方法,指数函数方法,取整函数方法,取量大值、最小值,以及平均值函数方法。这些方法都被定义为 static 形式,所以在程序中应用比较简便可以使用如下形式调用:
Math. 数学方法
在Math类中,除函数方法外还存在一些常用数字常量,如PI、E等。这些数学常量作为Math 关的成员变量出现,调用起来也很简单。可以使用如下形式调用:
Math.PI
Math.E
Math 类中的常用数学运算方法较多,大致可以将其分为四大类别,分别为三角函数方法,指数函数方法,取整函数方法,以及取最大值、最小值和绝对值函数方法。
Math. 数学方法
在Math类中,除函数方法外还存在一些常用数字常量,如PI、E等。这些数学常量作为Math 关的成员变量出现,调用起来也很简单。可以使用如下形式调用:
Math.PI
Math.E
Math 类中的常用数学运算方法较多,大致可以将其分为四大类别,分别为三角函数方法,指数函数方法,取整函数方法,以及取最大值、最小值和绝对值函数方法。
1.三角函数方法
Math 类中包含的三角函数方法如下:
public static double sin(doublea):返回角的三角正弦。
public static double cos(double a):返回角的三角余弦。
public static double tan(double a):返回角的三角正切。
public static double asin(doublea): 返回一个值的反正弦。
public static double acos(doublea): 返回一个值的反余弦。
public static double atan(doublea):返回一个值的反正切。
public static double toRadians(double angdeg): 将角度转换为弧度。
public static double toDegrees(double angrad): 将弧度转换为角度。
以上每个方法的参数和返回值都是double型的。将这些方法的参数的值设置为 double 型是有一定道理的,参数以弧度代替角度来实现,其中1°等于 /180 弧度,所以 180°可以使用弧度来表示。除了可以获取角的正弦、余弦、正切、反正弦、反余弦、反正切,Math 类还提供了角度和弧度相互转换的方法 toRadians()和 toDegrees()。但需要注意的是,角度与弧度的转换通常是不精确的。
Math 类中包含的三角函数方法如下:
public static double sin(doublea):返回角的三角正弦。
public static double cos(double a):返回角的三角余弦。
public static double tan(double a):返回角的三角正切。
public static double asin(doublea): 返回一个值的反正弦。
public static double acos(doublea): 返回一个值的反余弦。
public static double atan(doublea):返回一个值的反正切。
public static double toRadians(double angdeg): 将角度转换为弧度。
public static double toDegrees(double angrad): 将弧度转换为角度。
以上每个方法的参数和返回值都是double型的。将这些方法的参数的值设置为 double 型是有一定道理的,参数以弧度代替角度来实现,其中1°等于 /180 弧度,所以 180°可以使用弧度来表示。除了可以获取角的正弦、余弦、正切、反正弦、反余弦、反正切,Math 类还提供了角度和弧度相互转换的方法 toRadians()和 toDegrees()。但需要注意的是,角度与弧度的转换通常是不精确的。
2.指数函数方法
Math 类中与指数相关的函数方法如下:
public static double exp(double a):用于获取e的a次方,即取。
publicstatic doublelog(doublea):用于取自然对数,即取Ina的值。
publicstatic double log10(doublea):用于取底数为10的a的对数。
public static double sqrt(doublea):用于取a的平方根,其中a的值不能为负值。
public static double cbrt(double a):用于取a的立方根。
public static double pow(double a,double b):用于取a的b次方。
指数运算包括求方根、取对数以及求 n 次方的运算。
Math 类中与指数相关的函数方法如下:
public static double exp(double a):用于获取e的a次方,即取。
publicstatic doublelog(doublea):用于取自然对数,即取Ina的值。
publicstatic double log10(doublea):用于取底数为10的a的对数。
public static double sqrt(doublea):用于取a的平方根,其中a的值不能为负值。
public static double cbrt(double a):用于取a的立方根。
public static double pow(double a,double b):用于取a的b次方。
指数运算包括求方根、取对数以及求 n 次方的运算。
3.取整函数方法
在具体的问题中,取整操作使用也很普遍,所以Java 在 Math 类中添加了数字取整方法。Math 类中主要包括以下几种取整方法:
public static double ceil(double a):返回大于等于参数的最小整数。
public static double foor(double a): 返回小于等于参数的最大整数。
public static double rint(double a): 返回与参数最接近的整数,如果存在两个同样接近的整数则结果取偶数。
public staticintround(float a):将参数加上0.5后返回与参数最近的整数。
public static long round(double a): 将参数加上0.5 后返回与参数最近的整数,然后强制转换为长整型。
在具体的问题中,取整操作使用也很普遍,所以Java 在 Math 类中添加了数字取整方法。Math 类中主要包括以下几种取整方法:
public static double ceil(double a):返回大于等于参数的最小整数。
public static double foor(double a): 返回小于等于参数的最大整数。
public static double rint(double a): 返回与参数最接近的整数,如果存在两个同样接近的整数则结果取偶数。
public staticintround(float a):将参数加上0.5后返回与参数最近的整数。
public static long round(double a): 将参数加上0.5 后返回与参数最近的整数,然后强制转换为长整型。
4.取最大值、最小值、绝对值函数方法
在程序中最常用的方法就是取最大值、最小值、绝对值等,Math 类中包括的操作方法如下:
public static double max(double adouble 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):返回双精度浮点型参数的绝对值。
在程序中最常用的方法就是取最大值、最小值、绝对值等,Math 类中包括的操作方法如下:
public static double max(double adouble 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):返回双精度浮点型参数的绝对值。
Random类
11.2.3 Random类
Random类是JDK 中的随机数生成器类,可以通过实例化一个 Random 对象创建一个随机数生成器,语法如下:
Random r = new Random();
以这种方式实例化对象时,Java 编译器将以系统当前时间作为随机数生成器的种子。因为每时每刻的时间不可能相同,所以产生的随机数不同。但是如果运行速度太快,也会产生两个运行结果相同的随机数。
用户也可以在实例化 Random 类对象时,设置随机数生成器的种子。语法如下:
Random r = new Random(seedValue);
r:Random类对象。
seedValue:随机数生成器的种子。
Random类是JDK 中的随机数生成器类,可以通过实例化一个 Random 对象创建一个随机数生成器,语法如下:
Random r = new Random();
以这种方式实例化对象时,Java 编译器将以系统当前时间作为随机数生成器的种子。因为每时每刻的时间不可能相同,所以产生的随机数不同。但是如果运行速度太快,也会产生两个运行结果相同的随机数。
用户也可以在实例化 Random 类对象时,设置随机数生成器的种子。语法如下:
Random r = new Random(seedValue);
r:Random类对象。
seedValue:随机数生成器的种子。
在Random类中,提供了获取各种数类机数的方法,下面列举几个常用的方法:
public int nextint():返回一个随机整数。
public int nextInt(int n): 返回大于等于0且小于n 的随机整数。
public long nextLong():返回一个随机长整型值。
public boolean nextBoolean():返回一个随机布尔型值。
public float nextFloat0: 返回一个随机单精度浮点型值。
public double nextDouble():返回一个随机双精度浮点型值。
public double nextGaussian(): 返回一个概率察度为高斯分布的双精度浮点型值。
public int nextint():返回一个随机整数。
public int nextInt(int n): 返回大于等于0且小于n 的随机整数。
public long nextLong():返回一个随机长整型值。
public boolean nextBoolean():返回一个随机布尔型值。
public float nextFloat0: 返回一个随机单精度浮点型值。
public double nextDouble():返回一个随机双精度浮点型值。
public double nextGaussian(): 返回一个概率察度为高斯分布的双精度浮点型值。
BigInteger类
BigInteger 类的数字范围校 Integer类的数字范围要大得多。前文介绍计 Ineger 类是int的包装类,int的最大值为 ,如果要计算更大的数字,使用 Integer 类就无法实现了,所以Java中提供了BigInteger类来处理更大的数字。Biglnteger 类支持任意精度的整数,也就是说,在运算中BigInteger类可以准确地表示任何大小的整数值而不会丢失信息。
在BigInteger 类中封装了多种操作,除了基本的加、减、乘、除操作,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。
使用BigInteger 类,可以实例化一个BigInteger 对象,并自动调用相应的构造函数。BigInteger 类具有很多构造函数,但是直接的一种方式是参数以字符串形式代表有处理的数字。
例如,将 2 转换为 BigInteger 类型,可以使用以下语句进行初始化操作:
Biginteger twolnstance = new Bigintegor("2");
在BigInteger 类中封装了多种操作,除了基本的加、减、乘、除操作,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。
使用BigInteger 类,可以实例化一个BigInteger 对象,并自动调用相应的构造函数。BigInteger 类具有很多构造函数,但是直接的一种方式是参数以字符串形式代表有处理的数字。
例如,将 2 转换为 BigInteger 类型,可以使用以下语句进行初始化操作:
Biginteger twolnstance = new Bigintegor("2");
一旦创建了对象实例,就可以调用 BigInteger 类中的一些方法进行运算操作,包括基本的数学运算和位运算以及一些取相反数、取绝对值等操作。下面列举了 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 BigInteger[] divideAndRemainder(BigInteger val): 用数组返回余数和商,结果数组中第一个值为商,第二个值为余数。
public BigInteger pow(int exponent): 进行取参数的 exponent 次方操作。
public BigInteger negate(): 取相反数。
public BigInteger shifLeft(intn): 将数字左移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): 当参数是 BigInteger 类型的数字并且数值与对象实例的数值相等时,返回 true。
public BigInteger min(BigInteger val): 返回较小的数值。
public BigInteger max(BigInteger val): 返回较大的数值。
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 BigInteger[] divideAndRemainder(BigInteger val): 用数组返回余数和商,结果数组中第一个值为商,第二个值为余数。
public BigInteger pow(int exponent): 进行取参数的 exponent 次方操作。
public BigInteger negate(): 取相反数。
public BigInteger shifLeft(intn): 将数字左移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): 当参数是 BigInteger 类型的数字并且数值与对象实例的数值相等时,返回 true。
public BigInteger min(BigInteger val): 返回较小的数值。
public BigInteger max(BigInteger val): 返回较大的数值。
BigDecimal类
BigDecimal类和 BigInteger 类都能实现大数字的运算,不同的是 BigDecimal 类加入了小数的概念。一般的 float 型和 double 型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到 BigDecimal 类。BigDecimal 类支持任何精度的定点数,可以用它来精确计算货币值。在 BigDecimal类中,常用的两个构造方法如下表:
BigDecimal 类型的数字可以用来做超大的浮点数的运算,如加、减、乘、除等,但是在所有的运算中除法是最复杂的,因为在除不尽的情况下商小数点后的末位的处理是需要考虑的。BigDecimal 实现的加、减、乘、除的方法如表下:
在上述方法中,BigDecimal类中 divide0方法有多种设置,用于返回商小数点后的末位的处理,这些模式的名称与含义如表所示。
System 类
system 类是JDK 中提供的系统类,该类是用 fmal 修饰的,所以不允许被继。 System 类提供了最多系统层面的操作方法,并且这些方法全部都是静态的。System 类提供的较常用方法如下表:
控制台输出字符
System类提供了标准输入、标准输出和错误输出流,也就是说,System 类提供了3 个静态对象:in、out和err。本书中的代码多次使用了这些对象,最常见的就是out 对象。在控制台输出字符串,输出的方法有两种。
1.不会自动换行的print()方法
print()方法的语法如下:
System.out.print("Hello!");
此方法输出“Hello”文字,输出完毕后,光标会停留在“Hello” 文字末尾,不会自动换行。
print()方法的语法如下:
System.out.print("Hello!");
此方法输出“Hello”文字,输出完毕后,光标会停留在“Hello” 文字末尾,不会自动换行。
2.可以自动换行的println()方法
printin()方法在 print 后面加上了“ln”后缀 (就是 line 的简写),语法知下:
System.out.println("书籍是人类进步的阶梯!");
此方法输出“书籍是人类进步的阶梯!”后会自动换行。光标停留在下一行的开头。
println()方法与 println()方法输出的对比效果如表 所示:
printin()方法在 print 后面加上了“ln”后缀 (就是 line 的简写),语法知下:
System.out.println("书籍是人类进步的阶梯!");
此方法输出“书籍是人类进步的阶梯!”后会自动换行。光标停留在下一行的开头。
println()方法与 println()方法输出的对比效果如表 所示:
综上所述,Java 输出换行的方法有以下两种:
System.out.print("\n");//利用换行符\n实现换行
System.out.printIn();//空参数即可实现换行
System.out.print("\n");//利用换行符\n实现换行
System.out.printIn();//空参数即可实现换行
计时
System.currentTimeMillis()方法可以获取自 1970年1月1日零点至今的毫秒数。Date日期类也有类似的方法,但代码会比 System 类多,所以 System.currentTimeMillis()方法是为获取当前毫秒数最常用的方法。因为该方法的返回值精确到毫秒,所以可以利用该方法来记录程序的运行时间。
public class Test2{
public static void main(String[] args) {
long start=System.currentTimeMillis();//程序开始记录时间
String str=null;//创建null字符串
for(int i=0;i<10000;i++) {//循环一万次
str+=i;//字符串与循环变量拼接
}
long end=System.currentTimeMillis();//记录循环结束时间
System.out.println("循环用时:"+(end-start)+"毫秒");
}
}
public static void main(String[] args) {
long start=System.currentTimeMillis();//程序开始记录时间
String str=null;//创建null字符串
for(int i=0;i<10000;i++) {//循环一万次
str+=i;//字符串与循环变量拼接
}
long end=System.currentTimeMillis();//记录循环结束时间
System.out.println("循环用时:"+(end-start)+"毫秒");
}
}
Scanner类
与C 语言不同,Java 从控制台中读出用户输入的值,用到的不是一行可以直接使用的代码,而是 Scaner 的类来实现的。Scanner 英文直译就是扫描仪,它的用途就和现实生活的扫描仪一样,可以把数字化信息流转为人类可识别的文字。控制台输入内容用到了 System.out 就表示向控制台输出 ,System.in 就表示从控制台输入,让 Scanner 扫描 System.in 就可以获取用户输入的值了。
使用 Scanner 类首先要引入该类,其语法如下:
import java.util.Scanner; //引入 Scanner类
Scanner 类提供了如表 11.13 所示的几种常用的方法,通过这些方法可以取控制台中输入的不同类型的值。
使用 Scanner 类首先要引入该类,其语法如下:
import java.util.Scanner; //引入 Scanner类
Scanner 类提供了如表 11.13 所示的几种常用的方法,通过这些方法可以取控制台中输入的不同类型的值。
使用Scanner类扫描控制台的代码如下:
Scanner se = new Scanner(System.in);
Scanner se = new Scanner(System.in);
日期时间类
Date类
Date 类用于表示日期时间,使用该类表示时间需要使用其构造方法创建对象,其构造方法及其说明如表所示。
例如,使用 Date 类的第 2种构造方法创建一个 Date 类的对象,代码如下:
long timeMillis = System.currentTimeMillis(); //当前系统时间所经历的毫秒数
Date date = new Date(timeMillis);
long timeMillis = System.currentTimeMillis(); //当前系统时间所经历的毫秒数
Date date = new Date(timeMillis);
Date 类的常用方法及其说明如表 所示。
日期时间格式化
DateFormat 类是日期时间格式化子类的抽象类,可以按照指定的格式对日期或时间进行格式化DateFormat 类提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期时间Formatter,格式化风格主要包括 SHORT、MEDIUM、LONG 和FULL4种:
SHORT:完全为数字,如 12.13.2或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();
SHORT:完全为数字,如 12.13.2或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();
使用 getDateInstance()方法获取的是所在国家或地区的标准日期格式。另外,DateFormat 类还提供了一些其他静态方法。例如,使用 getTimeInstance()方法可获取所在国家或地区的时间格式,使用getDateTimeInstance()方法可获取日期和时间格式。DateFormat 类的常用方法及其说明如表 所示:
例如,将当前日期按照DateFormat类默认格式输出:
DateFormat df = DateFormat.getlnstance();
System.out.println(df.format(new Date()));
结果如下:
2021/2/19上午9:59
输出长类型格式的当前时间:
DateFormat df = DateFormat.getTimelnstance(DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
CST 上午10:00:33
输出长类型格式的当前日期:
DateFormat df = DateFormat.getDatelnstance(DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
2021年2月19日
输出长类型格式的当前日期和时间:
DateFormat df = DateFormatgetDate Timelnstance(DateFormat.LONG,DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
2021年2月19日CST 上午10:01:12
DateFormat df = DateFormat.getlnstance();
System.out.println(df.format(new Date()));
结果如下:
2021/2/19上午9:59
输出长类型格式的当前时间:
DateFormat df = DateFormat.getTimelnstance(DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
CST 上午10:00:33
输出长类型格式的当前日期:
DateFormat df = DateFormat.getDatelnstance(DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
2021年2月19日
输出长类型格式的当前日期和时间:
DateFormat df = DateFormatgetDate Timelnstance(DateFormat.LONG,DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
2021年2月19日CST 上午10:01:12
SimpleDateFormat 类提供了 19 个格式化字符,可以让开发者随意编写日期格式,这19 个格式化字符如表 所示:
通常上一表中的字符出现的数量会影响数字的格式。例如,yyyy 表示 4 位年份,这样输入会示2021;yy 表示两位,这样输入就会显示为21;只有一个y的话,会按照 yyyy 显示;如果超过4个y,如yyyyyy,会在4位年份左侧补0,结果为02021。一些常用的日期时间格式如下表:
DateFormat 类提供的 Date parse(String source)方法可以将字符串转为其字面日期对应的 Date对象,整个过程相当于日期格式化的逆操作。
例如,将“2021-02-19”这个字符串转成 Date 对象,可以使用如下代码:
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd);.
Date date = sdf.parse("2021-02-19");
例如,将“2021-02-19”这个字符串转成 Date 对象,可以使用如下代码:
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd);.
Date date = sdf.parse("2021-02-19");
Calendar类
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。另外,该类还为实现包范围外的具体日历系统提供了其他字段和方法,这些字段和方法被定义为 protected。
Calendar 提供了一个类方法 getInstance(),以获得此类型的一个通用的对象。Calendar 类的getInstance()方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化,其使用方法如下:
Calendar rightNow = Calendar.getlnstance();
Calendar 提供了一个类方法 getInstance(),以获得此类型的一个通用的对象。Calendar 类的getInstance()方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化,其使用方法如下:
Calendar rightNow = Calendar.getlnstance();
Calendar 类提供的常用字段及其说明如表所示:
Calendar 类提供的常用方法及其说明如表所示:
最后对 Calendar 类的使用做出几点总结:
c.set(CalendarDAY_OF_MONTH,0)获取的是上个月的最后一天,所以调用前需要将月份往后加一个月。
Calendar.MONTH的第一个月是使用0记录的,所以在获得月份数字后要加1。年和日是从1开始记录的,不需要加 1。
Calendar.DAY OF WEEK 的第一天是周日,周一是第二天,周六是最后一天。
c.set(CalendarDAY_OF_MONTH,0)获取的是上个月的最后一天,所以调用前需要将月份往后加一个月。
Calendar.MONTH的第一个月是使用0记录的,所以在获得月份数字后要加1。年和日是从1开始记录的,不需要加 1。
Calendar.DAY OF WEEK 的第一天是周日,周一是第二天,周六是最后一天。
Runtime类
Runtime 类是 JDK 供的运行时类,该类为 Java程序提供了与当前运行环境相连接的一个通道,Runtime 类不能使用 new 关键字创建实例,只能通过 Runtime. getRuntime()方法获取实例。
Runtime 类的常用方法如下表:
Runtime 类的常用方法如下表:
执行本地命令
本地命令指的是操作系统的命令。例如,在 Linux 系统下就表示 shell 命令,在 Windows 系统下表示 cmd 命令。
Runtime 类提供 exec()方法让 Java 代码可以执行系统的命令,exec()方法有很多重载的形式,例如:
Process exec(String command)
Process exec(Stringl cmdarray)
command:要执行的系统命令,字符串类型。
cmdarray:要执行的命令和相应的命令参数,字符串数组类型。
Runtime 类提供 exec()方法让 Java 代码可以执行系统的命令,exec()方法有很多重载的形式,例如:
Process exec(String command)
Process exec(Stringl cmdarray)
command:要执行的系统命令,字符串类型。
cmdarray:要执行的命令和相应的命令参数,字符串数组类型。
其实这两个重载方式很类似,如执行“javac hello.java”这行命令,使用第一种重载方式的代码如下
Runtime.getRuntime().exec("javac hello.java");
Runtime.getRuntime().exec("javac hello.java");
使用第二种重载方式的代码如下:
String command] = {"javac", "hello,java" };
Runtime.getRuntime().exec(command);
String command] = {"javac", "hello,java" };
Runtime.getRuntime().exec(command);
Process类的常用方法如表 所示,开发可以使用 getInputStream()方法获取进程返回的信息:
查看内存
Runtime类可以通过 freeMemory()方法查看当前Java 虚拟机可用内存的剩余量。如果程序能够实时监控内存剩余量,就可以尽量控制程序对内存的占用,从而避免出现“内存溢出”的情况。同样,也可以用来对测试程序性能,检验程序算法是否导致内存紧张。
public class CountDown {
public static void main(String[] args) {
Runtime r=Runtime.getRuntime();//获取本地Runtime对象
Integer ints[]=new Integer[10000];//创建长度为10000的整型数组
long before=r.freeMemory();//获取当前空闲内存数
System.out.println("赋值前空闲内存字节数:"+before);
for(int i=0,length=ints.length;i<length;i++) {//循环为整型数组赋值
ints[i]=i;//赋值
}
long after=r.freeMemory();//获取当前空闲内存数
System.out.println("赋值后空闲内存字节数:"+after);
System.out.println("数组用掉的内存字节数:"+after);//输出数组用掉的内存量
}
}
public static void main(String[] args) {
Runtime r=Runtime.getRuntime();//获取本地Runtime对象
Integer ints[]=new Integer[10000];//创建长度为10000的整型数组
long before=r.freeMemory();//获取当前空闲内存数
System.out.println("赋值前空闲内存字节数:"+before);
for(int i=0,length=ints.length;i<length;i++) {//循环为整型数组赋值
ints[i]=i;//赋值
}
long after=r.freeMemory();//获取当前空闲内存数
System.out.println("赋值后空闲内存字节数:"+after);
System.out.println("数组用掉的内存字节数:"+after);//输出数组用掉的内存量
}
}
收藏
0 条评论
下一页