JAVA基础

1.JAVA语言基础

1.1.主类概念

1.1.1包声明

一个Java应用程序是由若干个类组成的。package为包的关键字

1.1.2成员变量和局部变量

通常将类的属性称为类的全局变量(成员变量),将方法中的属性称为局部变量。全局变量声明在类体中,局部变量声明在方法体中。全局变量和局部变量都有各自的应用范围.

1.1.3主方法

main()方法是类体中的主方法。public、static和void分别是main()方法的权限修饰符、静态修饰符和返回值修饰符,Java程序中的main()方法必须声明为public static void。main()方法是程序开始执行的位置.

1.1.4导入其他类

在Java语言中可以通过import关键字导入相关的类。

1.2.基本数据类型

1.2.1整数类型

整数类型简称整型,用来存储整数数值,即没有小数部分的数值。可以是正数,也可以是负数。整型数据根据它所占内存大小的不同,可分为byte、short、int和long 4种类型。它们具有不同的取值范围。

1.2.2浮点类型

浮点类型简称浮点型,用来存储含有小数部分的数值。Java语言中浮点类型分为单精度浮点类型(float)和双精度浮点类型(double),它们具有不同的取值范围。

在默认情况下小数都被看作double型,若想使用float型小数,则需要在小数后面添加F或f。另外,可以使用后缀d或D来明确表明这是一个double类型数据,但加不加d或D并没有硬性规定。而定义float型变量时,如果不加F或f,系统会认为是double类型数据,进而出错。

误区:浮点值属于近似值,在系统中运算后的结果可能与实际有偏差。

1.2.3字符类

  • 字符类型(char)用于存储单个字符,占用16位(两个字节)的内存空间。在定义字符型变量时,要以单引号表示。

  • String类型为字符串类型,可以用来保存由多个字符组成的文本内容,其用法与字符类型类似,但文本内容需要用双引号标注。

转义字符是一种特殊的字符变量,它以反斜杠“\”开头,后跟一个或多个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”。

1.2.4布尔类型

布尔类型又称逻辑类型,简称布尔型,通过关键字boolean来定义布尔类型变量。布尔类型只有true和false两个值,分别代表布尔逻辑中的“真”和“假”。布尔值不能与整数类型进行转换。布尔类型通常被用在流程控制中,作为判断条件。

1.3.变量与常量

1.3.1标识符和关键字

  • 标识符

  • 标识符可以简单地理解为一个名字,是用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。

  • Java语言规定标识符由任意顺序的字母、下画线(_)、美元符号($)和数字组成,并且第一个字符不能是数字。标识符不能是Java中的关键字。标识符中的字母是严格区分大小写的

  • 关键字

关键字又称保留字,是Java语言中已经被赋予特定意义的一些单词,不可以把这些单词作为标识符来使用。

1.3.2变量?

在程序运行过程中,空间内的值是变化的,这个内存空间就称为变量。为了便于操作,给这个空间取个名字,称为变量名。变量的命名必须是合法的标识符。内存空间内的值就是变量值。在声明变量时可以是没有赋值,也可以是直接赋给初值。

命名规则:

  • 变量名必须是一个有效的标识符。

  • 变量名不可以使用Java中的关键字。

  • 变量名不能重复。

  • 应选择有意义的单词作为变量名。

  • 尽量不要使用其他语言文字作为变量名

1.3.3常量?

在程序运行过程中一直不会改变的量称为常量(constant),通常也被称为“final变量”。常量在整个程序中只能被赋值一次。

在Java语言中声明一个常量,除了要指定数据类型,还需要通过final关键字进行限定。声明常量的标准语法:final 数据类型 常量名称 [ = 值],常量名通常使用大写字母,但这并不是必需的。很多Java程序员使用大写字母表示常量,是为了清楚地表明正在使用常量。

当变量被final关键字修饰时,该变量就变成了常量,必须在定义时就设定它的初值,否则将会产生编译错误

1.3.4变量的有效范围

变量的有效范围是指程序代码能够访问该变量的区域,若超出该区域,则在编译时会出现错误。在程序中,一般会根据变量的“有效范围”将变量分为“成员变量”和“局部变量”

  1. 成员变量

  • 在类体中所声明的变量被称为成员变量,成员变量在整个类中都有效。类的成员变量又可分为两种,即静态变量和实例变量。

  • 如果在成员变量的类型前面加上关键字static,这样的成员变量称为静态变量。静态变量的有效范围可以跨类,甚至可达到整个应用程序之内。对于静态变量,除了能在声明它的类内存取,还能直接以“类名.静态变量”的方式在其他类内使用。

  1. 局部变量

  • 在类的方法体中声明的变量(方法内部定义,“{”与“}”之间的代码中声明的变量)称为局部变量。局部变量只在当前代码块中有效,也就是只能在“{”与“}”之内使用。

  • 在类的方法中声明的变量,包括方法的参数,都属于局部变量。局部变量只在当前定义的方法内有效,不能用于类的其他方法中。局部变量的生命周期取决于方法,当方法被调用时,Java虚拟机会为方法中的局部变量分配内存空间,当该方法的调用结束后,则会释放方法中局部变量占用的内存空间,局部变量也将会被销毁。

  • 局部变量可与成员变量的名字相同,此时成员变量将被隐藏,即这个成员变量在此方法中暂时失效。

1.4.运算符

1.4.1赋值运算符

赋值运算符以符号“=”表示,它是一个二元运算符(对两个操作数作处理),其功能是将右方操作数所含的值赋给左方的操作数。

由于赋值运算符“=”处理时会先取得右方表达式处理后的结果,因此一个表达式中若含有两个以上的“=”运算符,会从最右方的“=”开始处理。

1.4.2算术运算符

Java中的算术运算符主要有+(加)、-(减)、*(乘)、/(除)、%(求余),它们都是二元运算符。

在进行除法运算时,0不能做除数。例如,对于语句“int a = 5 / 0;”,系统会抛出ArithmeticException异常。

1.4.3自增和自减运算符

自增、自减运算符是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增1或减1。放在操作元前面的自增、自减运算符,会先将变量的值加1(减1),然后再使该变量参与表达式的运算。放在操作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后再将该变量加1(减1)。

1.4.4比较运算符

比较运算符属于二元运算符,用于程序中的变量之间、变量和自变量之间以及其他类型的信息之间的比较。比较运算符的运算结果是boolean型。当运算符对应的关系成立时,运算结果为true,否则为false。所有比较运算符通常作为判断的依据用在条件语句中。比较运算符共有6个

1.4.5逻辑运算符

返回类型为布尔型的表达式,如比较运算符,可以被组合在一起构成一个更复杂的表达式。这是通过逻辑运算符来实现的。逻辑运算符包括&(&&)(逻辑与)、‖(逻辑或)、!(逻辑非)。逻辑运算符的操作元必须是boolean型数据。在逻辑运算符中,除了“!”是一元运算符,其他都是二元运算符。

通常将这种在逻辑表达式中从左端的表达式可推断出整个表达式的值的情况称为“短路”,而那些始终需要执行逻辑运算符两边的表达式才能推断出整个表达式的值的情况称为“非短路”。“&&”属于“短路”运算符,而“&”属于“非短路”运算符。

1.4.6位运算符

位运算符除“按位与”和“按位或”运算符外,其他只能用于处理整数的操作数,包括byte、short、char、int和long等数据类型。位运算是完全针对位方面的操作。

  1. 按位与运算

  • 按位与”运算的运算符为“&”,为双目运算符。“按位与”运算的运算法则是:如果两个整型数据a、b对应位都是1,则结果位才是1,否则为0。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同

  1. 按位或运算

  • “按位或”运算的运算符为“|”,为双目运算符。“按位或”运算的运算法则是:如果两个操作数对应位都是0,则结果位才是0,否则为1。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同,

  1. 按位取反运算

  • 按位取反”运算也称“按位非”运算,运算符为“~”,为单目运算符。“按位取反”就是将操作数二进制中的1修改为0,0修改为1,

  1. 按位异或运算

  • “按位异或”运算的运算符是“^”,为双目运算符。“按位异或”运算的运算法则是:当两个操作数的二进制表示相同(同时为0或同时为1)时,结果为0,否则为1。若两个操作数的精度不同,则结果的精度与精度高的操作数相同

  1. 移位操作

  • "<<":左移

  • “>>”:右移

  • “>>>”:右移

左移就是将运算符左边的操作数的二进制数据,按照运算符右边操作数指定的位数向左移动,右边移空的部分补0。右移则复杂一些。当使用“>>”符号时,如果最高位是0,右移空的位就填入0;如果最高位是1,右移空的位就填入1。无符号右移“>>>”,无论最高位是0还是1,左侧被移空的高位都填入0。

1.4.7三元运算符

使用格式:条件式 ?值1 :值2

运算规则为:若条件式的值为true,则整个表达式取值1,否则取值2

1.4.8运算符的优先级

通常,优先级由高到低的顺序依次是:

  • 增量和减量运算。

  • 算术运算。

  • 比较运算。

  • 逻辑运算。

  • 赋值运算。

1.5数据类型转换

1.5.1隐式转换

从低级类型向高级类型的转换,系统将自动执行,程序员无须进行任何操作。

转换规则:

1.5.2显式转换

当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换运算(又称强制类型转换)

语法:(类型名)要转换的值

执行显式类型转换时,可能会导致精度损失。除boolean类型外,其他基本类型都能以显式类型转换的方法实现转换。当把整数赋值给一个byte、short、int、long型变量时,不可以超出这些变量的取值范围,否则必须进行强制类型转换

1.6代码注释与编码规范

  1. 单行注释

  • “//”为单行注释标记,从符号“//”开始直到换行为止的所有内容均作为注释而被编译器忽略

  1. 多行注释

  • “/* /”为多行注释标记,符号“/”与“*/”之间的所有内容均为注释内容。注释中的内容可以换行。

  1. 文档注释

  • “/** /”为文档注释标记。符号“/**”与“/”之间的内容均为文档注释内容。当文档注释出现在声明(如类的声明、类的成员变量的声明、类的成员方法的声明等)之前时,会被Javadoc文档工具读取作为Javadoc文档内容。除注释标记不同外,文档注释的格式与多行注释的格式相同。

  1. 编码规范(可参考阿里开发手册)

  • 每条语句尽量单独占一行,每条语句都要以分号结束。

  • 在声明变量时,尽量使每个变量单独占一行,即使有多个数据类型相同的变量,也应将其各自放置在单独的一行上,这样有助于添加注释。对于局部变量,应在声明的同时对其赋予初始值。

  • 在Java代码中,空格仅提供分隔使用,无其他含义,开发者应控制好空格的数量,不要写过多的无用空格。

  • 为了方便日后的维护,不要使用技术性很高、难懂、易混淆的语句。

  • 对于关键的方法要多加注释,这样有助于阅读者了解代码的结构与设计思路。

2.流程控制

2.1复合语句

以整个块区为单位的语句,所以又称块语句。复合语句由开括号“{”开始,闭括号“}”结束。

2.2条件语句

2.2.1 if条件语句

用于告诉程序在某个条件成立的情况下执行某段语句,而在另一种情况下执行另外的语句

if条件语句可分为简单的if条件语句、if…else语句和if…else if多分支语句。

简单的if条件语句:

  • 布尔表达式:必要参数,表示最后返回的结果必须是一个布尔值。它可以是一个单纯的布尔变量或常量,也可以是使用关系或布尔运算符的表达式。

  • 语句序列:可选参数。可以是一条或多条语句,当表达式的值为true时执行这些语句。若语句序列中仅有一条语句,则可以省略条件语句中的“{ }”

if…else语句:

  • if后面“()”内的表达式的值必须是boolean型的。如果表达式的值为true,则执行紧跟if语句的复合语句;如果表达式的值为false,则执行else后面的复合语句。

if…else if多分支语句:

  • 条件表达式1~条件表达式n:必要参数。可以由多个表达式组成,但最后返回的结果一定要为boolean类型。

  • 语句序列:可以是一条或多条语句,当条件表达式1的值为true时,执行语句序列1;当条件表达式2的值为true时,执行语句序列2,依此类推。当省略任意一组语句序列时,可以保留其外面的“{ }”,也可以将“{ }”替换为“;”。

2.2.2 switch多分支语句
  • switch语句中表达式的值必须是整型、字符型、字符串类型或枚举类型,常量值1~n的数据类型必须与表达式的值的类型相同。switch语句首先计算表达式的值,如果表达式的计算结果和某个case后面的常量值相同,则执行该case语句后的若干个语句直到遇到break语句为止。此时,如果该case语句中没有break语句,将继续执行后面case中的若干个语句,直到遇到break语句为止。若没有一个常量的值与表达式的值相同,则执行default后面的语句。default语句为可选的,如果它不存在,且switch语句中表达式的值不与任何case的常量值相同,switch语句则不做任何处理。

2.3循环语句

2.3.1 while循环语句

while语句也称条件判断语句,它的循环方式为利用一个条件来控制是否要继续反复执行这个语句.

  • 当条件表达式的返回值为真时,则执行“{}”中的语句,当执行完“{}”中的语句后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。

2.3.2 do…while循环语句

do…while循环语句与while循环语句类似,它们之间的区别是while语句为先判断条件是否成立再执行循环体,而do…while循环语句则先执行一次循环后,再判断条件是否成立。也就是说,do…while循环语句“{}”中的程序段至少要被执行一次.

do…while语句与while语句的一个明显区别是,do…while语句在结尾处多了一个分号。根据do…while循环语句的语法特点总结出的do…while循环语句的执行过程

2.3.3 for循环语句

for循环可以用来重复执行某条语句,直到某个条件得到满足。for循环有两种语句,一种是传统的for语句,一种是foreach语句.

for语句

  • 表达式1:初始化表达式,负责完成变量的初始化。

  • 表达式2:循环条件表达式,值为boolean型的表达式,指定循环条件。等同于while循环里的表达式。

  • 表达式3:每次循环结束后执行的语句,通常用来改变循环条件。

  1. foreach语句

  • foreach语句是for语句的特殊简化版本,不能完全取代for语句,但任何foreach语句都可以改写为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称为foreach语句。foreach语句在遍历数组等方面为程序员提供了很大的方便

2.4循环控制

2.4.1 break语句

使用break语句可以跳出switch结构。在循环结构中,同样也可用break语句跳出当前循环体,从而中断当前循环。

  • 循环嵌套情况下,break语句将只会使程序流程跳出包含它的最内层的循环结构,即只跳出一层循环。

如果想让break跳出外层循环,Java提供了“标签”的功能,

  • 标签名:任意标识符。

  • 循环体:任意循环语句。

  • break标签名:break跳出指定的循环体,此循环体的标签名必须与break的标签名一致。

2.4.2 continue语句

continue语句是针对break语句的补充。continue不是立即跳出循环体,而是跳过本次循环,回到循环的条件测试部分,重新开始执行循环。在for循环语句中遇到continue后,首先执行循环的增量部分,然后进行条件测试。在while和do…while循环中,continue语句使控制直接回到条件测试部分

与break语句一样,continue也支持标签功能

  • 标签名:任意标识符。

  • 循环体:任意循环语句。

  • continue标签名:continue跳出指定的循环体,此循环体的标签名必须与continue的标签名一致。

3.数组

3.1数组概述

数组是最为常见的一种数据结构,是相同类型的用一个标识符封装到一起的基本类型数据序列或对象序列。

3.2一维数组

一维数组实质上是一组相同类型数据的线性集合,当在程序中需要处理一组数据,或者传递一组数据时,可以应用这种类型的数组。

3.2.1创建一维数组

数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量所属的类型。一维数组的创建有两种形式。

先声明,再用new关键字进行内存分配

  1. 声明的同时为数组分配内存

3.2.2初始化

数组与基本数据类型一样可以进行初始化操作。数组的初始化可分别初始化数组中的每个元素。数组的初始化有以下两种方式

3.3二维数组

二维数组常用于表示表,表中的信息以行和列的形式组织,第一个下标代表元素所在的行,第二个下标代表元素所在的列。

3.3.1创建二维数组

二维数组可以看作是特殊的一维数组,因此二维数组的创建同样有两种方式。

  1. 先声明,再用new关键字进行内存分配

  1. 声明的同时为数组分配内存

3.3.2初始化

二维数组的初始化与一维数组初始化类似,同样可以使用大括号完成。

  • type:数组数据类型。

  • arrayname:数组名称,一个合法的标识符。

  • value:二维数组中各元素,都代表一个一维数组。

3.4数组基本操作

3.4.1遍历数组

遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for或forearch循环来实现

遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度。

3.4.2填充替换数组元素

数组中的元素定义完成后,可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法通过各种重载形式可完成对任意类型的数组元素的替换。fill()方法有两种参数类型,

  1. fill(int[] a,int value)

该方法可将指定的int值分配给int型数组的每个元素。

  • a:要进行元素替换的数组。

  • value:要存储数组中所有元素的值。

  1. fill(int[] a,int fromIndex,int toIndex,int value)

该方法将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromIndex(包括)一直到索引toIndex(不包括)。如fromIndex==toIndex,则填充范围为空。

  • a:要进行填充的数组。

  • fromIndex:要使用指定值填充的第一个元素的索引(包括)。

  • toIndex:要使用指定值填充的最后一个元素的索引(不包括)。

  • value:要分配给数组指定范围中的每个元素的值。

3.4.3对数组进行排序

通过Arrays类的静态方法sort()可以实现对数组的排序。sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序。

3.4.4复制数组

Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。copyOf()方法是复制数组至指定长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中。

  1. copyOf()方法

该方法提供了多种重载形式,用于满足不同类型数组的复制

  • arr:要进行复制的数组。

  • newlength:int型常量,指复制后的新数组的长度。如果新数组的长度大于数组arr的长度,则用0填充(根据复制数组的类型来决定填充的值,整型数组用0填充,char型数组则使用null来填充);如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一个元素开始截取至满足新数组长度为止。

  1. copyOfRange()方法

  • arr:要进行复制的数组对象。

  • formIndex:指定开始复制数组的索引位置。formIndex必须在0至整个数组的长度之间。新数组包括索引是formIndex的元素。

  • toIndex:要复制范围的最后索引位置。可大于数组arr的长度。新数组不包括索引是toIndex的元素。

3.4.5查询数组

Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定数组,以获得指定对象。该方法返回要搜索元素的索引值。binarySearch()方法提供了多种重载形式,用于满足各种类型数组的查找需要。binarySearch()方法有两种参数类型。

  1. binarySearch(Object[] a, int fromIndex, int toIndex, Object key)

  • a:要搜索的数组。

  • fromIndex:指定范围的开始处索引(包含fromIndex)。

  • toIndex:指定范围的结束处索引((不包含toIndex)。

  • key:要搜索的值。

  • 如果key包含在数组中,则返回搜索值的索引;否则返回-1或“-”(插入点)。插入点是搜索键将要插入数组的那一点,即第一个大于此键的元素索引。

3.5数组排序算法

3.5.1冒泡排序

基本思想

  • 把相邻两个元素进行比较,如满足一定条件则进行交换(如判断大小或日期前后等),每次循环都将最大(或最小)的元素排在最后,下一次循环是对数组中其他的元素进行类似操作。

3.5.2直接选择排序

基本思想

  • 将指定排序位置元素与其他数组元素分别对比,如果满足条件就交换元素值。注意这里与冒泡排序的区别,不是交换相邻元素,而是把满足条件的元素与指定的排序位置元素交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,直至整个数组都变成已排序好的格式。

3.5.3反转排序

基本思想

  • 把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,依此类推,直到把所有数组元素反转替换。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值