目录
Java是一种面向对象的程序设计语言,包括三个体系:
-
JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版)
-
JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版)
-
JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版)。
基础
Java源文件名必须和public类名相同(类名+.java作为保存文件名);即一个源文件中最多只能有一个public类(可以有多个非public类)。若类定义在包中,则package语句应在源文件首行;import在package之后,类定义前。
标识符应以字母,美元符($)或者下划线(_)开始。
类型
Java提供了八种基本类型:
-
byte:有符号8位整数(-128~127);
-
short:有符号16位整数;
-
int:有符号32位整数;
-
long:有符号64位整数;默认0L;
-
float:单精度32位浮点数;默认0.0f;
-
double:双精度64位浮点数;默认0.0d;
-
boolean:布尔,ture、false;
-
char:16位Unicode字符;
-
对单个字符操作时,使用Character类;
-
String
标识字符串类型,且不可修改,使用其静态方法format可方便进行格式字符串处理;
当需要对字符串修改时,使用StringBuffer或StringBuilder。两者的方法和功能是完全等价;但:
-
StringBuffer是线程安全的(其方法大都用synchronized修饰);
-
StringBuilder是线程不安全的(速度快,适合单线程情况下使用);
数组
存储固定大小类型相同的元素(从0开始索引),通过java.util.Arrays 类可方便地操作数组;
dataType[] arrayRefVar = new dataType[arraySize];
type[][] typeName = new type[typeLength1][typeLength2];
日期时间
由java.util包提供的 Date 类实现;初始一个新对象即可获取当前时间,如:
Date date = new Date();
通过SimpleDateFormat 来格式化日期,其parse可方便解析时间字符串;
字母 | 描述 | 示例 |
---|---|---|
G | 纪元标记 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一个月的日期 | 10 |
h | A.M./P.M. (1~12)格式小时 | 12 |
H | 一天中的小时 (0~23) | 22 |
m | 分钟数 | 30 |
s | 秒数 | 55 |
S | 毫秒数 | 234 |
E | 星期几 | Tuesday |
D | 一年中的日子 | 360 |
F | 一个月中第几周的周几 | 2 (second Wed. in July) |
w | 一年中第几周 | 40 |
W | 一个月中第几周 | 1 |
a | A.M./P.M. 标记 | PM |
k | 一天中的小时(1~24) | 24 |
K | A.M./P.M. (0~11)格式小时 | 10 |
z | 时区 | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 单引号 | ` |
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
Date t = ft.parse("2019-05-09");
也可以通过printf格式化,%t后跟格转换符:
转 换 符 | 说 明 | 示 例 |
---|---|---|
c | 包括全部日期和时间信息 | 星期六 十月 27 14:21:20 CST 2007 |
F | "年-月-日"格式 | 2007-10-27 |
D | "月/日/年"格式 | 10/27/07 |
r | "HH:MM:SS PM"格式(12时制) | 02:25:51 下午 |
T | "HH:MM:SS"格式(24时制) | 14:28:16 |
R | "HH:MM"格式(24时制) | 14:28 |
System.out.printf("全部日期和时间信息:%tc%n",date);
修饰符
访问修饰符(保护类、变量、方法等):
-
默认(default,不用任何修饰符):同一包内可见;
-
private:私有;
-
public:公开;
-
protected:保护,同一包内的类和所有子类可见;
非访问修饰符:
-
static:创建类方法和类变量(即静态);
-
final:
-
类:不可继承;
-
方法:不能被继承类重新定义;
-
变量:常量;
-
-
abstract:抽象类与抽象方法;
-
synchronized:线程间同步,同一时间只能一个线程访问;
-
volatile:每次访问时,必须从内存中重读变量值;
-
transient:序列化时忽略此变量;
运算符
-
instanceof:检查对象是否时特定类型(myInst instanceof myClass)
-
算术运算符
-
关系运算符
-
位运算符
循环结构
-
while
-
do ... while
-
for
-
for(初始化; 布尔表达式; 更新)
-
for(声明语句 : 表达式) // 表达式为可枚举类型,如数组等
-
异常处理
所有异常继承自java.lang.Exception。
try ... catch ... finally:处理异常;
throw:抛出异常;
throws:放在方法后面,表面方法可能抛出的异常;
面向对象相关
继承
使用extends继承(类继承类,接口继承接口);instanceof判断是否是对应类型;implements用于实现接口。类是单继承,接口可以多继承。
重写一般使用@Override修饰(避免因疏忽把重写变成了重载);父类使用super标识。
public interface Ia { ... }
public interface Ib { ... }
public interface Ic extends Ia {...}
public class A { ... }
public class B extends A implements Ic, Ib {...}
接口
通过interface声明接口,接口中的方法是隐式抽象的(即不需要使用abstract修饰);接口方法都是公有的;
接口不能实例化,只能由类实现;接口可以多继承。
函数式接口
只定义一个抽象方法的接口;可通过@FunctionalInterface标注;
java8中接口可以拥有默认方法(即类没有对方法进行实现时,其主体为方法提供默认实现的方法)
finalize
finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法(调用时机是不确定的,System.gc()发起回收指令)。
包package
package pkg1[.pkg2[...]]
包把不同java程序分类保存,方便其他程序调用。
通过import引入包(*表示引入所有公开类)
import pkg1[.pkg2[...]].(className|*)
高级
泛型
即‘参数类型化’,可用于类、接口和方法。泛型的类型参数只能是类类型(不能是简单类型)。
泛型方法:类型参数在方法的返回类型之前,多个类型用逗号分开;通过extends限定类型范围(有界类型):
public static <T extends Comparable<T>> T maximun(T x, T y)
{ ... }
泛型类型:类名后面添加泛型参数即可
public class Test<T> { ... }
操作类型不确定,且只使用Object中的功能是,可以使用通配符(?)表示未知类型:
public void getKeyValue(Generic<?> obj){
System.out.println(obj.getKey());
}
文件与流
Java.io包几乎包含了所有操作输入、输出需要的类。FileInputStream与FileOutputStream可方便用于文件流读写;其他一些文件相关类:
-
File:磁盘中实际存在的文件和目录;
-
mkdirs:创建文件夹和他所有父文件夹(若不存在);
-
-
FileReader(继承自InputStreamReader):按字符读取流中数据;
-
FileWriter(继承自OutputStreamWriter):按字符向流中写入数据;
Scanner
java.util.Scanner可方便地处理基本类型与字符串,通过next**获取,hasNext**判断是否有:
-
next():获取下一个token(string),一定要读到有效字符串才可结束输入(前导空白被自动忽略);
-
nextLine():获取一行;
-
hasNextInt():是否有整数;
-
nextInt():获取整数
// 从输入中获取浮点数
Scanner sc = new Scanner(System.in);
f = sc.nextFloat();
lambda表达式
lambda理解为简洁地表示可传递的匿名函数的一种方式;其类型是从上下文推断出来的。Lambda可以无限制地捕获实体变量和静态变量,但局部变量必须是final或事实上的final(只赋值一次)。
(params) -> expression // 表达式结果为返回值
(params) -> { statements; } // 若有返回,需要明确return
如:
() -> {} // 空表达式(无参数,无返回值)
lambda表达式可直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(即函数式接口的一个具体实现实例);
附录
CentOS7下部署Java编译环境
1、下载jdk***.tar.gz
2、复制到/usr/local下,解压(tar -zxvf )
3、设置环境变量
vi /etc/profile #添加以下内容(ClassPath中要增加当前目录./)
JAVA_HOME=/usr/local/jdk1.8.0_131
JRE_HOME=$JAVA_HOME/jre
CLASSPATH=./:$JAVA_HOME/lib:$JRE_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
source /etc/profile #使配置生效
4、测试
public class Hello {
public static void main(String[] args){
System.out.println("Hello, My Java!");
}
}
javac Hello.java #编译
java Hello # 执行