主要内容
详细内容
基本格式
所有Java代码都应该在一个class中。
Java是严格区分大小写的。
Java是一种自由格式的语言。Java代码分为结构定义语句和功能执行语句,功能执行语句最后必须以分号结束。
注释
文档注释
Java中特有的一种注释,它可以通过JDK提供的工具(javadoc.exe)公爵直接将源代码中的文档注释提取成一份系统的API文档。
格式:/**注释内容*/。
单行注释
在程序中注释一行代码,在Java中,将双斜线(//)放在需要注释的内容之前便可。
多行注释
指一次性地将多行代码注释掉。使用“/*”和“*/”将程序中需要注释的内容包含起来,“/*”表示注释的开始,“*/”表示注释的结束。
标识符
定义
标识符是程序中自定义的一些名字,包括:包名、类名、函数名、变量名、常量名。
命名规则
由大小写字母、数字、下划线(_)和美元符号($)组成,开头不能是数字。不能使用关键字。推荐使用全英文。
通用规范
(1)类名、接口名:所有单词首字母大写,驼峰式命名,例如:XxxYyyZzz
(2)变量名、函数名:第一个单词首字母小写,其他单词首字母大写,驼峰式命名,例如:xxxYyyZzz
(3)常量名:所有字母都大写,单词之间用下划线分割,例如:XXX_YYY_ZZZ
(4)包名:全部小写,例如:xxx.yyy.zzz
关键字
注意:java 无sizeof ,goto, const 关键字,但不能用goto const作为变量名
常量
整型
整型:整数,4个字节。
长整型:整数,8个字节。以L结尾。
浮点型
单精度浮点数:小数,4个字节。以F结尾。
双精度浮点数:小数,8个字节。
布尔
只有两个值,真(true)或假(false),1个字节。
字符
单个字符,2个字节。
在字符常量中,斜杠(\)是一个特殊的字符,它的作用是用来转义后面一个字符,这些字符通常是不可见的或者有特殊意义的。
'\r' 回车,回到一行的开始
'\n' 换行,换到下一行
'\t' 制表符,键盘上的Tab
'\b' 类似退格,键盘上的Backspace
以上字符都不可见,无法直接表示,所以用斜杠加上另外一个字符来表示。
'\'' 单引号,Java代码中单引号表示字符的开始和结束,如果直接写程序会认为前两个是一对,报错。
'\"' 双引号,Java代码中双引号表示字符串的开始和结尾,如果要写一个包含双引号的字符串那么这个双引号也需要转义。
'\\' 斜杠,Java代码中的斜杠是转义字符,用来和后面一个字符配合使用,在真正需要用斜杠的时候那么就要用另一个斜杠来转义。
以上字符都有特殊意义,无法直接表示,所以用斜杠加上另外一个字符来表示。
字符串:由若干个字符组成的一串。可以是一个字符、多个字符、或者一个都没有。字符串没有固定大小。
空:null
只有这一个值,用来表示一个引用为空。
变量
定义
变量没有固定的值,是在内存中开辟的一片空间。
Java中的变量中只能存储同一种类型的值。
变量在被取值之前必须初始化(第一次给变量赋值)。
变量分类
a.基本数据类型: 8种
整数:
byte 1个字节,最小值:-128,最大值:127
short 2个字节,最小值:-32768,最大值:32767
int 4个字节,最小值:-2147483648,最大值:2147483647
long 8个字节,最小值:- 9223372036854775808,最大值:9223372036854775807
浮点数:
float 4个字节,最小值:1.4E-45,最大值:3.4028235E38
double 8个字节,最小值:4.9E-324,最大值:1.7976931348623157E308
字符:
char 2个字节,最小值:0,最大值:65535
布尔:
boolean 1个字节,true或false
b.引用数据类型:
类、接口、数组都是引用数据类型,除了8种基本数据类型,其他所有类型都是引用数据类型。
类型转化
a. 自动类型转换
在byte、short、char参与运算的时候会自动提升为int,相当于将一个占空间较小的值放入了一个较大的空间。如下图所示:
b. 强制类型转换
可以将一个占空间较大的值使用(类型)的形式强制放入一个较小的空间,有可能损失精度。
c. 字符串转换
任何值和字符串相加都会得到字符串。
变量的作用域与生命周期
作用域:变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。
相同的作用域中不能定义两个同名变量。
生命周期:变量的生命周期从定义时开始,超出作用域后结束。变量生命周期以外不能使用。
补充:成员变量和局部变量的区别:
(1)作用域:
成员变量:针对整个类有效;
局部变量:只在某个范围内有效(一般只的是方法,语句体内)。
(2)存储位置:
成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中;
局部变量:当方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。
(3)初始值:
成员变量:有默认的初始值;
局部变量:没有默认的初始值,使用前必须赋值。
函数
函数的定义
函数就是一段有名字的代码,可以完成某一特定功能。
如果某个函数在执行的时候需要调用者传入数据,那么可以定义参数列表,用于接收数据。
如果函数运行之后需要返回给调用者数据,那么需要指定返回值类型,并且用关键字return返回。
定义函数的3个必要条件:函数名、参数列表、返回值类型。如果不需要参数也要写小括号,如果没有返回值类型要写void。
参数类型:函数的参数的类型,一旦定义传入时必须匹配。
返回值:函数运行结束后返回的值,使用return关键字返回。
返回值类型:函数运行结束后返回的值的类型,在类型非void情况下必须返回,而且必须类型匹配。
形参和实参
形参:在定义函数时小括号中的参数,用来接收数据的参数。
实参:在调用函数时真正传入的参数,传递给函数的数据。
重载和覆盖
重载(overload)
表示在一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同);在调用时,JVM就会根据不同的参数样式选择合适的方法执行。
在使用重载时需要注意以下几点:
(1)在使用重载的时候只能通过不同的参数样式,比如说:不同的参数类型,不同的参数个数,不同的参数顺序;
(2)不能通过访问权限、返回类型、抛出的异常进行重载;
(3)方法的异常类型和数目不会对重载造成影响;
(4)对于继承来说,如果某一方法在父类中的访问权限是private,那么就不能在子类中进行重载,如果定义的话,也只是定义了一个新方法,不会达到重载的效果。
覆盖(override)
表示子类的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了。
在继承中可能存在子类覆盖父类的方法,需要注意以下几点:
(1)覆盖的方法的标志必须和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
(2)覆盖的方法的返回值必须和被覆盖的方法返回一致;
(3)覆盖的方法所抛出的异常必须和被覆盖的方法所抛出的异常一致,或者是其子类;
(4)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有进行覆盖。
运算符
算数运算符
包括:+(正号)、—(负号)、+(加)、—(减)、*(乘)、/(除)、%(取模)、++(自增前)、++(自增后)、——(自减前)、——(自减后)、
加号:在操作数字、字符、字符串时是不同的,两个字符相加得到的是码表值,两个字符串相加是将字符串连接在一起。
除号:整数在使用除号操作时,得到的结果仍为整数(小数部分忽略)。
取模:模数的符号忽略不计,结果的正负取决于被模数。
自增:符号在前就是先运算后取值,符号在后则是先取值后运算。
赋值运算符
包括:=(赋值)、+=(加等于)、-=(减等于)、*=(乘等于)、/=(除等于)、%=(模等于)
比较运算符
比较运算符运行结束之后返回的都是boolean值。
注意:运算符==不要写成=
逻辑运算符
逻辑运算符运行结束之后返回的也是boolean值
总结:&& 在前半是false的时候短路,|| 在前半是true的时候短路
位运算符
任何信息在计算机中都是以二进制的形式保存的,&、|、^除了可以作为逻辑运算符,也可以做为位算符。
它们对两个操作数中的每一个二进制位都进行运算,0当做false,1当做true。
运算符优先级
尽量写简单的表达式,遇到运算符优先级的问题使用括号解决。
语句
顺序结构
程序从上到下一行一行执行的结构,中间没有判断和跳转,直到程序结束。
选择结构
程序具备多个分支,通过条件判断决定程序选择那一条分支执行
if语句:
通过if...else if...else决定程序流程。
如果if中的条件满足则执行其中语句,if未满足则继续判断else if,如果满足则执行,不满足继续判断下一个else if,如果所有都不满足,则执行else。
具体格式如下所示:
if (logic expression)
{
statement...
}
else if(logic expression)
{
statement...
}
...//可以有零个或多个else if语句
else//最后的else语句也可以省略
{
statement...
}
switch语句:
通过switch...case...default语句控制程序流程。
根据switch后括号中的值判断运行哪一个case,这个值可以是byte、short、ch;ar、int。
default语句是可选的,如果所有case都不满足,则会执行default。
一旦匹配到一个case,程序就会从这个case向下执行,执行完一个case之后不会跳过其他的case,如需跳过请使用break。
在switch语句后面的控制表达式的数据类型只能是byte,short,char,int四个整数类型和枚举类型,不能是boolean类型。Java 7中允许switch语句中的控制表达式为java.lang.String类型;
具体格式如下所示:
switch (expression)
{
case condition1:statement1;
break;
case condition2:statement2;
break;
...
case conditionN:statementN;
break;
default:
statement;
}
三元运算符
语法:表达式 ? 结果1 : 结果2
如果表达式结尾为true取结果1,为false则取结果2。
注意三元运算符也是有短路的效果,根据表达式的结果,只运行冒号一边的,另外一边的不参与运行。
循环结构
通过循环语句让同一段代码反复执行多次,执行完毕程序才会继续往后运行
while
先判断while中的表达式结果是否为true,true则执行循环体,执行结束之后再次判断,如果表达式结果为false则跳出循环。
具体格式如下所示:
[init_statement]
while (test_condition)
{
statement;
[iteration_statement]
}
do...while
先执行一次循环体,然后判断while中的表达式,如果是true继续执行,如果是false则跳出循环。
具体格式如下所示:
[init_statement]
do
{
statement;
[iteration_statement]
}
while (test_condition);
for
for循环的括号中有三条语句,都是可选项。
语句1:这条语句会在整个循环开始之前执行,且仅运行一次,不参与循环。
语句2:必须是一个返回boolean值的表达式,如果写了这个语句那么每次循环开始之前会判断,true则执行循环,false则不执行。没写则直接执行。
语句3:这条语句在每次循环体运行结束之后执行。
具体格式如下所示:
for (init_statement;test_expression ;iteration_statement )
{
statement;
}
continue、break、return
continue:结束本次循环,继续执行下一次
break:结束循环
return:结束方法
数组
定义
数组是一个类型一致,长度不可变的容器。可以通过索引操作容器中的每一个元素。
如果有多个类型相同的数据需要存储,可以将其定义为一个数组,这样做省去了创建多个变量的麻烦。
具体语法格式如下所示:
静态初始化:
type [] arrayName = new type[]{element1,element2,element3 ...};
动态初始化:
type [] arrayName = new type[length];
访问数组元素、遍历数组
存在数组中的数据是有索引的,从0开始递增,我们通过数组名和索引就可以操作其中每一个元素。
数组的长度
数组可以使用length属性获取其长度。
遍历数组
由于数组可以通过索引获取每一个元素,又可以通过length获取长度,那么可以定义循环来遍历数组中的每一个元素了。
使用数组时的异常
如果访问数组时索引越界(小于0或者大于length-1),会抛出异常:ArrayIndexOutOfBoundsExcepion
如果访问数组的引用为空(null),会抛出空指针异常:NullPointerException
与数组操作相关函数
Arrays.toString() : 将一个数组转为字符串表示形式;
具体方法格式如下所示:
public static String toString(type[] a)
System.arraycopy() :将一个数组中的某些元素拷贝到另一个数组的指定位置;
具体方法格式如下所示:
public static void arraycopy(Object src,int srcPos,Object dest, int destPos,int length)
数组分类
多维数组:数组中的每一个元素都是数组,这样的数组就是多维数组。
补充:
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放;
堆内存:数组和对象,通过new关键字建立的实例都存放在堆内存中;
方法区:静态方法,构造函数,常量池,线程池等;
本地方法区:window系统所占用。