JAVA语法基础
一、基础
1、java 语言是面向对象的程序设计语言,基本组成单元就是类;
2、一个应该程序必须包含一个main()方法,它是程序的入口和起点;
3、java严格区分大小写;对于类名,应该以大写字母开头;
4、//注释; /*多行注释*/ /**文档注释*/
5、变量命名规则:任意不以数字开头的字母、数字、下划线、$的组合;
6、变量使用前必须先声明,一次可同时声明多个相同类型的变量并赋值,以逗号分隔;如果是常量则需要用final关键字进行限定;
7、Java支持:多态,继承,封装,抽象,类,对象,实例,方法,重载;
二、运算符
赋值:+=,-+,*=,/+,(%)= ,= (可将多个变量的赋值连在一起来赋值,a=b=c=1)
算术:+,-,*,/,%,++,--
比较:>,<,==,>=,<=,!=
逻辑:&&,||,!
位运算:&(与),|(或),~(取反),^(异或,同取0,异取1),<<(用0补空位),>>(用最高位数字补空位),>>>(用0补空) (都是针对于2进制数位运算的。)
条件: ? :
优先级:括号>正负>自增、减、非>算术>位移>比较>&>^>|>&&>||>条件>赋值;
三、数据类型
1、整型
包括:byte(8位),short(16位),int(32位),long(64位)
以0开头的为八进制,以0x开头的为16进制;
2、浮点型
包括:float(16位),double(32位)
3、char字符类型
用单引号包围,如果单个字符用双引号包围则表示的是一个字符串;
常用方法:
isLetter() 是否是字母;
isDigit() 是否是数字;
isWhitespace() 是否是空格;
isUpperCase() 是否是大写字母;
isLowerCase() 是否是小写字母;
toUpperCase() 转换为大写;
toLowerCase() 转换为小写;
toString() 返回字符串形式;
4、布尔类型 boolean
5、数据类型转换
隐式数据类型转换(低级向高级):char<byte<int<short<long<float<double
显示数据类型转换:格式如下 int a = (int)2.2
6、Number类常用方法(所有整型、浮点型数据都是它的子类)
typeValue() 将Number对象转换为type数据类型并返回(如:intValue(Num))
compareTo() 比较,返回值;
equals() 比较,返回boolean值;
valueOf() 返回指定类型数据;
toString() 以字符串形式返回值;
parseInt() 将字符串解析为int类型;
Math类常用方法(Math类中的方法都是static的,可直接使用):
abs() 返回参数绝对值;
ceil() 返回大于等于给定参数的最小整数;
floor() 返回小于等于给定参数的最大整数;
rint() 返回与参数最接近的整数的double形式;
round() 四舍五入;
min() 返回两个参数中小的;
max() 返回两个参数中大的;
exp() 返回自然底数e的参数次方;
log() 返回自然数底数对数值;
pow() 次方;
sqrt() 平方根;
sin() 正弦;相似还有cos(),tan(),asin(),acos(),atan();
toDegrees() 将参数转换为角度;
toRadians() 转换为弧度;
random() 返回一个随机数;
四、字符串String
1、所有由双引号包围的都是字符串;
2、多个字符串可用+号连接在一起,当与其他类型的数据连接时也会将其他数据自动转换成字符串;
但是如果快速频繁的使用字符串连接,可使用StringBuilder类来实现,因为+会新实例一个字符串,会消耗内存资源。
转义字符:
\n 换行; \r 回车; \f 换页; \b 退格; \0 空字符; \s 字符串; \t 制表符; \" 双引号; \' 单引号; \\ \; \ddd 八进制字符; \uxxxx 十六进制字符;
3、常用字符串类的方法:
length() 获取字符串的长度; indexOf() 查找指定字符或字符串的位置,如果没有找到返回-1; lastIndexOf() 逆向查找指定字符或字符串的位置,如果没有找到返回-1; charAt() 返回指定索引位置的字符; substring() 截取指定位置的字符串,接受开始和结束两个参数,如果只有一个则到结束位置; trim() 去掉开始和结尾的空格; replace() 替换字符或字符串,接受原字符和新字符两个参数; startsWith() 判断是否以某个字符或字符串开头; endsWith() 判断是否以某个字符或字符串结尾; equals() 比较和指定字符串是否相同(如果是用==比较其实是比较的内存地址); equalsIgnoreCase() 忽略大小写比较; compareTo() 比较和指定字符串的大小,相同返回0,否则为一个正数或负数; toLowerCase() 转换为小写; toUpperCase() 转换为大写; toCharArray() 转换为数组; split() 将字符串在指定字符串(可接受正则表达式)处拆分,还可以接受一个可选的拆分次数的参数; concat() 将参数字符串连接到此字符串最后; format(format,obj) 字符串格式化输出;
4、常用格式化转换符:
%b、%B 转换为布尔类型; %h、%H 转换为散列码类型; %s、%S 转换为字符串类型; %c、%C 转换为字符类型; %d 转换为十进制; %o 转换为八进制; %x、%X 转换为十六进制; %e 转换为科学计数; %a 转换为带有有效位数和指数的十六位制浮点值; %n 转换为特定平台的分隔符; %% 字面量‘%’;
5、常用日期Date()数据格式化转换符:
%tF ‘年-月-日’格式时间(4位) %tD ‘月/日/年’格式时间(2位) %tc 全部日期和时间信息; %tr “hh:mm:ss pm"格式时间; %tT "hh:mm:ss"24小时时间; %tR ”hh:mm"24小时制时间; %te 一个月的一天; %tb 指定语言环境下月份简称; %tB 指定语言环境下月份全称; %ta 指定语言环境下星期简称; %tA 指定语言环境下星期全称; %tc 包括全部日期和时间信息; %ty 2位的年份显示; %tY 4位的年份显示 %tj 一年中的第几天; %td 一个月中的第几天; %tm 月份; %tH 2位数字的24小时制小时; %tI 2位数字的12小时制小时; %tk 24小时制小时; %tl 12小时制小时; %tM 2位分钟数; %tS 2位秒数; %tL 3位毫秒数; %tN 9位微秒数; %tp 指定语言环境下上下午标记; %tz 相对于GMT RFC 82格式的数字时区偏移量; %tZ 时区缩写; %ts 1970至现在经过的秒数; %tQ 1970至现在经过的毫秒数;
以上都是print的格式输出,如:System.out.printf("%tF", new Date());
五、数组Array
1、声明: type name[] 或者 type[] name
2、实例化分配内存地址: name = new type[n]; 或者直接给定数组,{value1,value2,...}
3、Java支持多维数组;
4、可使用foreach语句来遍历数组,格式:for(type name : arrayName){}
5、Arrays的常用静态方法:
fill(arrayName,value) 用value值为arrayName所有元素赋值;其中还可添加起始位置;
sort(arrayName) 排序;
copyOf(arrayName,length) 复制数组,lengh为新数组的长度,如果length大于arrayName长度,则用0补充;
copyOfRang(arrayName,start,end) 复制数组;
binarySearch(arrayName,key) 查找元素的索引,如果没有结果则返回-1或-插入点。还可以加入可选的起始位置参数;
6、枚举enum
六、控制结构
1、条件
(1)if(booleanExpression) { sentences; } else if(booleanExpression) { sentences; } ... else { sentences; }
(后边的else if和else结构都是可选使用的;) (2)switch(Expression) { case 常量1: sentences; break; case 常量2: sentences; break; ... default: sentences; break; }
(在1.7以前,表达式必须是整型或字符型,在从1.7开始以后还可以使用字符串类型进行判断)
2、循环
(1)while(booleanExpression) { sentences; } (2)do { sentences; }while(booleanExpression) (3)for(;;) { sentences; } (4) for(元素:被遍历对象) { sentences; } 可使用break和continue来控制循环;使用break 循环体标签;来跳出指定循环体(标签的使用: 标签名:任意标识符)
七、类Class
1、方法格式
权限修饰符 返回值类型 方法名(参数类型 参数名,...)
{
具体方法内容;
}
this 关键字使用访问自身成员,可用于解决局部变量;
super 关键字使用访问父类成员;访问的是上一级的方法,而不是最高级的;如果上一级不存在此方法就再向上一级追溯;
2、构造方法:每个类都有构造方法,也可以有多个不同参数的构造方法;构造方法名与类名相同;
finalize() 这个方法在对象被收集器回收之前调用,类似于析构函数;
3、类的继承extends
格式: class childClass extends parentClass{}
子类拥有父类的非private属性和方法,且可有自己的扩展方法,可对父类的方法进行重写;
Java是单继承,但可以多重继承;
当继承接口时使用implements,接口可以是多继承的;
4、方法重写规则:
1)参数列表与返回类型必须与重写方法相同;
2)访问权限不能比父类的更低;
3)声明为final和static的不能被重写,但static的可以被再次声明;
4)构造方法不能被重写;
5、多态就是同一个方法具有多个不同的参数从而具有不同的实现的能力,也是同一个接口使用不同的实例而执行不同操作;
八、接口interface
1、在java中是一个抽象类型,抽象方法的集合;使用interface声明;
2、接口不能用于实例,没有构造方法,所有的方法都必须是抽象的,接口的方法不是被继承了,而是要被类实现;
3、接口是默认方法抽象的,不用使用abstract来声明;
4、类在实现接口方法时,不能抛出强制性异常,只能在接口中或者继承接口的抽象类中抛出该强制异常;
5、如果是抽象类,则就没有必要实现该操的方法;
6、一个类可以继承多个接口,接口可以被接口继承;
7、标记接口:没有任何方法的接口,主要用于给某个对象一个标记,使对象拥有某些特权;
8、extends和implements
extends有继承的意思,implements有实现的意思;接口继承接口只能使用extends,implements对象可以有多个;
9、如果需要一个有很多方法的接口中的一几个方法,可以使用一个抽象类来继承此接口(把必须要实现的方法设为abstract),然后再继承此抽象类;Java8中可对接口中的方法使用default关键字修饰,来包含一些默认的方法实现,在继承这个接口时可不用重写这个方法,而直接调用此方法的默认实现;
10、接口可以嵌套接口、类,类也可的嵌套类、接口;
九、其他
1、包package
1)、把功能相似或相关的类或接口放在一起,方便查找和使用,也限定了访问权限
2)、要使用某个包需要用import关键字来引入包;
2、访问修饰符:
public 公用,所有可见; protected 本类和子类可见; private 只有本类可见;对于嵌套类中声明为私有的类的公用方法,也不能从外部调用; default 缺省,同一包内可见;
其他修饰符: static 静态的,唯一的,无论有多少实例,静态变量都只有一个值;局部变量不能被声明为静态的;静态方法不能使用类的非静态变量; final 关键字修饰的类不能被继承,修饰的方法不能被重写覆盖;修饰变量只能赋值一次;如果和static一起来修饰变量则是常量; abstract 抽象类不能被实例,可以包含抽象和非抽象方法,但如果一个类含有抽象方法则必须声明为抽象类,抽象类不能用final修饰;抽象方法不能用final和static修饰,如果抽象类的子类不是抽象类则必须实现父类的抽象方法; synchronized 修饰的方法同一时间只能被一具线程访问; transient 修饰变量定义时用来预处理类和变量的数据类型,不会持久化; volatile 修饰的变量在每次被线程访问时都强制从共享内存重新读取该变量的值;且当变量发生变化时,会强制线程将变化值回写到共享内存;
3、异常处理
1)捕获
try{} catch(ExceptionName e){}
2)多重捕获
try{} catch(ExceptionName1 e){} catch(ExceptionName2 e){}...
3)抛出异常
如果一个方法没有捕获一个检查性异常,那么些方法需要使用throws来声明;
throw可在方法抛出一个指定异常;
在所有捕获异常后,还可以加一个finally{}模块,写入无论什么结果都会执行的语句;