1. jdk版本
我最后使用的jdk版本是1.8
2. 基本语法
(1) 大小写敏感
(2) 类名首字母大写
(3) 方法名首字母小写
(4) 源文件名必须和类名相同
(5) 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行
(6) Java是解释执行还是编译执行? 答: 采用的是解释和编译混合的模式。它首先将源码编译成字节码文件class, 然后通过解释器将字节码转换成机器码。
(7) 使用 javac 编译,java命令运行,例如:
$ javac Employee.java $ java Employee
3. 对象和类
(1) 一个源文件中只能有一个 public 类, 但可以有多个非public 类
(2) 源文件的名称应该和 public 类的类名保持一致
(3) package 语句 在源文件最前面,然后是 import 语句
4. 基本数据类型
(1) Java语言提供了八种基本类型, byte, short, int, long, float, double, boolean, char
(2) 其中六种数据类型都是有符号的。
(3) Long的写法例子: long a = 100000L 。 L 不区分大小写,为避免混淆一般写L
(4) float的写法例子 float f1 = 234.5f
(5) double的写法例子 double d1 = 8.0d
(6) char 类型是 16 位 Unicode 字符, 可以储存任何字符
(7) 在Java中,引用类型的变量非常类似于C/C++的指针。
例子:Site site = new Site("Runoob")。
对象、数组都是引用数据类型。
(8) final 关键字来修饰常量, final double PI = 3.1415927
(9) 当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制。
int octal = 0144; int hexa = 0x64;
(10) 字符串和字符都可以包含任何 Unicode 字符, 例如:
char a = '\u0001'; String a = "\u0001";
(11) 类型转换: 运算中,不同类型的数据先转化为同一类型,然后进行运算
级别从低到高的顺序: byte,short,char—> int —> long—> float —> double
把容量大的类型转换为容量小的类型时必须使用强制类型转换
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
(12) 整数的默认类型是 int;
小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 f
5. 变量类型
(1) 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
(2) 实例变量(即C++的成员变量),可以 声明 在使用前或者使用后。
实例变量可以在声明时指定值,也可以在构造方法中指定值;
实例变量可以直接通过变量名访问,不需要加 this. 但在静态方法中,要使用完全限定名,即:Obeject.VariableName 的形式
(3) 类变量也称为静态变量,在类中以 static 关键字声明
无论一个类创建了多少个对象,类只拥有类变量(静态变量)的一份拷贝
类变量(静态变量)储存在静态存储区,经常被声明为常量
大多数静态变量声明为 public 类型, 使用大写字母
静态变量可以通过:ClassName.VariableName的方式访问, 例如: Employee.DEPARTMENT
6. 修饰符
(1) private: 同一类可见
(2) default: 同一包中可见
(3) public: 不同类中可见,不同包中可见
(4) protected: 同一包中可见, 不同包中的子类可见,但只能继承不能直接使用
(5) static:
用来声明独立于对象的 静态变量 和 静态方法,用 class.variable 和 class.method 访问
(6) final
final 修饰的变量:等同于常量,通常和 static 修饰符一起使用来创建类常量。例子:public static final int BOXWIDTH = 6;
final 修饰的方法:父类中的 final 方法可以被子类继承,但是不能被子类重写。
final 修饰的类:不能被继承
(7) abstract
abstract 修饰抽象类:抽象类不能实例化对象,唯一目的是为了将来对该类进行继承。
abstract 修饰抽象方法: 抽象方法是一种没有任何实现的方法,具体实现由子类提供。
(8) synchronized
synchronized 声明的方法同一时间只能被一个线程访问。
(9) transient
序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
(10) volatile
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该变量的值。
当变量发生变化时,会强制线程将变化值回写到共享内存。
在任何时刻,两个不同的线程总是看到某个变量的同一个值。
7. 运算符
同样地包含以下运算符: %, ++, --, &&, || , &, |, ^(异或), !
有一特别的: instanceof (检查该对象是否是一个特定类型(类类型或接口类型))
8. 循环结构
(1) while( 布尔表达式 ) { //循环内容 }
(2) do { //代码语句 }while(布尔表达式);
(3) for(初始化; 布尔表达式; 更新) { //代码语句 }
(4) for(声明语句 : 表达式) { //代码句子 },例如:for( String name : names ) { }
(5) 同样有 break, continue
9. 条件结构
同样有 if(布尔表达式){ }else{ }, 和 switch(表达式){ case 变量 : break; default : }
10. Number & Math 类常用方法
(1) xxxValue(): 将 Number 对象转换为xxx数据类型的值并返回。
(2) valueOf(): 返回一个 Number 对象指定的内置数据类型, 例子:Double c = Double.valueOf(5);
(3) toString(): 以字符串形式返回值, 例子:Integer x = 5; System.out.println(x.toString());
(4) parseInt(): 将字符串解析为int类型, 例子:int x =Integer.parseInt("9");
(5) abs(): 返回参数的绝对值。
(6) ceil(): 向上取整,类型为double。
(7) floor(): 向下取整, 类型为double。
(8) round(): 四舍五入,算法为 Math.floor(x+0.5),即将原来的数字加上 0.5 后再向下取整,所以,Math.round(11.5) = 12,Math.round(-11.5) = -11。
(9) min(): 返回两个参数中的最小值
(10) max(): 返回两个参数中的最大值。
(11) random(): 返回一个随机数。例子:System.out.println( Math.random() );
12. 转义字符
\t 在文中该处插入一个tab键
\n 在文中该处换行
\r 在文中该处插入回车
\' 在文中该处插入单引号
\" 在文中该处插入双引号
\\ 在文中该处插入反斜杠
13. Character 类
实际开发过程中,遇到需要使用对象,而不是char的情况时,可以使用Character类。Character类也提供了一些字符操作和判断的方法
14. String 类
(1) String 类是不可改变的,所以一旦创建了 String 对象,它的值就无法改变
如果需要对字符串做修改,那么应该选择使用 StringBuffer & StringBuilder 类。
(2) String 类的静态方法 format() 能用来创建可复用的格式化字符串. 例如:
String.format("浮点型变量的值为 " + "%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + " %s", floatVar, intVar, stringVar);
15. StringBuffer 和 StringBuilder 类
(1) string 不能被修改
(2) StringBuffer 能修改,线性安全,效率相对低
(3) StringBuilder 能修改,线性不安全,效率相对高
16. 数组
(1) 数组的创建:
dataType[] arrayRefVar = new dataType[arraySize];
或者: dataType[] arrayRefVar = {value0, value1, ..., valuek};
(2) 数组的访问
double[] myList = {1.9, 2.9, 3.4, 3.5};
for (int i = 1; i < myList.length; i++) {
if (myList[i] > max) max = myList[i];
}
或者:
for(type element: array)
{
System.out.println(element);
}
(3) 数组可以作为参数和返回值
public static int[] printArray( int[] array ) {
return array;
}
(4) java支持多维数组
(5) Arrays 类: 提供一些便利的数组方法
fill:给数组赋值
sort:对数组排序
equals:比较数组
binarySearch:查找数组元素(二分查找法)
17. 日期时间
(1) java.util 包提供了 Date类 封装日期和时间
使用当前时间:Date date = new Date();
使用指定时间戳:Date date = new Date(long millisec) 毫秒数
(2) Date类最主要方法:
long getTime( ) 返回时间戳,毫秒数。
String toString( ) 返回时间字符串
before(),after() 和 equals(): 比较两个时间的大小
(3) 使用 SimpleDateFormat 格式化日期
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
Date dNow = new Date( );
System.out.println("当前时间为: " + ft.format(dNow));
(4) 使用 SimpleDateFormat 解析字符串为时间
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
String input = "1818-11-11" ;
Date t;
try {
t = ft.parse(input);
} catch (ParseException e) {}
(5) 休眠(sleep)
Thread.sleep(毫秒数);
(6) 获取当前毫秒数
System.currentTimeMillis( );
(7) Calendar类: 可以更方便的设置和获取日期
18. 方法
(1) 可变参数 ...
public static void printMax( double... numbers) {
for (int i = 1; i < numbers.length; i++){
System.out.println( numbers[i]);
}
}
(2) finalize() 方法:
Java 允许定义这样的方法,它在对象被垃圾收集器析构之前调用
protected void finalize() { // 在这里终结代码 }
19. Java 流(Stream)、文件(File)和IO
(1) 读: 文件 => FileInputStream => InputStreamReader
写: OutputStreamReader => FileOutputStream => 文件
(2) 字节流和字符流:
FileInputStream 从文件读取字节,面向的是字节流,和字符编码无关。
InputStreamReader 从字节流读取数据,面向的是字符流,处理字符编码的问题。
(3) Java中的文件和目录处理,通过java.io.File的以下方法完成:
mkdir() 创建一个文件夹,
mkdirs() 输入一个路径,创建整个路径的文件夹和文件。
list() 提取包含的文件和文件夹的列表。
isDirectory() 判断是不是目录
delete() 删除文件
20. Scanner 类
可以通过 Scanner 类来获取用户的输入.
使用 hasNext 与 hasNextLine 判断是否还有输入的数据
使用 next() 与 nextLine() 获取输入的字符串
Scanner scan = new Scanner(System.in);
if (scan.hasNextLine()) {
String str2 = scan.nextLine();
}
21. 异常处理
(1) 捕获异常例子,注意finally必定执行,可以用来回收资源。
try {
file = new FileInputStream(fileName);
x = (byte) file.read();
} catch(FileNotFoundException f) { //第一种异常
f.printStackTrace();
return -1;
} catch(IOException i) { //第二种异常
i.printStackTrace();
return -1;
} finally{ //不管什么程序,最后必定执行
// 程序代码
}
(2) 主动抛出异常:throw new RemoteException();