一.基本数据类型
基本元素类型 | 大小 | 最小值 | 最大值 | 包装器类型 | 默认值 |
---|---|---|---|---|---|
boolean | - | - | - | Boolean | false |
byte | 8 bit | -2^(8-1) | 2^(8-1)-1 | Byte | 0 |
char | 16 bit | Unicode 0 | Unicode 2^16-1 | Character | null |
short | 16 bit | -2^(16-1) | 2^(16-1) -1 | Short | 0 |
int | 32 bit | -2^(32-1) | 2^(32-1)-1 | Integer | 0 |
long | 64 bit | -2^(64-1) | 2^(64-1)-1 | Long | 0L |
float | 32 bit | IEEE 754 | IEEE 754 | Folat | 0.0f |
double | 64 bit | IEEE 754 | IEEE 754 | Double | 0.0d |
void | - | - | - | - | - |
高精度数字 | 可表示任何精度的整数 | - | - | BigInteger | - |
高精度数字 | 可表示任何精度的整数 | - | - | BigDecimal |
二.操作符
位操作符:
操作整数基本元素类型中的单个bit,即二进制位。
操作符 | ||||
---|---|---|---|---|
与 & | 1&1 = 1 | 1&0 = 0 | 0&0 = 0 | 操作位有0,结果则为0 |
或 | | 1|1 = 1 | 1|0 = 1 | 0|0 = 0 | 操作位有1,结果则为1 |
异或 ^ | 1^1 = 0 | 1^0 = 1 | 0^0 = 0 | 操作位一样,结果为0,否则为1 |
非 ~ | ~1 = 0 | ~0 = 1 | ||
左移 << | (60 << 2) = (0011 1100 << 2) = 1111 0000 = 240 | 低位补0 | ||
右移 >> | (60 >> 2) = (0011 1100 >> 2) = 0000 1111 = 15 省略符号位: (-60 >> 2) = (0011 1100 >> 2) = 0000 1111 = 15 取反加1:1100 0100 移位补位:1111 0001 取反加1:0000 1111 | 正符号:右移,高位插入0; 负符号:符号位不变,取反低位加1,然后右移,高位插入1。最后保留符号位,按位取反低位加1。 |
如果对char,byte,short进行移位操作,将会先转换成int类型,再进行移位。
三.异常
Error:编译时和系统错误,比如:OutOfMemoryError
Exception:可被抛出的基本类型异常。通常分为两类:
1.检查时异常,此类异常通常需要强行进行try…catch处理或者throws抛出异常,在别处进行try…catch处理。否则编译不过。比如:SQLException ,IOException 。
2.运行时异常,多数继承自RuntimeException,不强制进行try…catch处理。比如: NullPointerException,IllegalStateException, ClassCastException,SecurityException等。
异常的处理方式:
1.try…catch…finally处理
finally部分可有可无,如果有使用文件读取、网络操作以及数据库操作等,一般建议在finally的代码块中释放资源。
try {
FileInputStream inputStream = new FileInputStream("d:/test.txt");
int ch = inputStream.read();
System.out.println("try is running");
} catch (FileNotFoundException e) {
System.out.println("file not found");
}catch (IOException e) {
System.out.println("io exception");
}finally{
System.out.println("finally");
}
2.throws,抛出异常,交给调用者处理。
此方法抛出的异常,如果是RuntimeException ,则不需要调用者强行try…catch。如果是非RuntimeException ,则调用者需要强行捕获此异常,否则编译不过。
public void readXML() throws Exception{
FileInputStream inputStream = new FileInputStream("d:/test.txt");
int ch = inputStream.read();
//...
}
当然,我们也可以在代码中主动抛出异常,throw new Exception(),这个需要结合throws使用,比如:
throws抛出的异常必须要比throw 抛出的异常范围大,否则编译不过。
public void readXML() throws Exception{
FileInputStream inputStream = new FileInputStream("d:/test.txt");
int ch = inputStream.read();
//...
throw new IOException();
}
关于子类重写父类的方法时,异常的处理方式:
1)父类的方法没有声明异常,子类在重写该方法的时候不能声明异常;
2)父类的方法中声明的异常范围要比子类的方法中声明的异常要大。
3)如果父类的方法声明的异常类型只有非运行时异常(运行时异常),则子类在重写该方法的时候声明的异常也只能有非运行时异常(运行时异常),不能含有运行时异常(非运行时异常)。
finally和return
无论try中是否有return,finally中的代码块是肯定是要执行的。如果try和finally中都含有return语句,那么会护理try中的return语句而执行finally中的return。如下:
public class Test {
public static void main(String args[]) {
Test t = new Test();
System.out.println("main i = "+t.print());
}
public int print() {
int i = 0;
try {
i++;
System.out.println("try i = "+i);
return i;
} catch (Exception e) {
i++;
System.out.println("catch i = "+i);
} finally {
System.out.println("finally i = "+i);
return ++i;
}
}
}
输出的打印如下:
try i = 1
finally i = 1
main i = 2
参考:https://blog.csdn.net/stduent_/article/details/60955365
四.接口和继承
https://www.cnblogs.com/dolphin0520/p/3811437.html
五.多态
多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。
方法绑定:https://www.cnblogs.com/jstarseven/articles/4631586.html
五.初始化
对象创建时,初始化过程:
1.java解释器查找类路径,定位class文件。(静态方法/静态域被首次访问时,或者首次创建对象时,因为构造器实际上也是静态方法)
2.载入class文件,静态初始化。(静态初始化只有在class对象首次加载时进行一次)
3.new创建对象时,在堆上为对象分配足够的存储空间
4.在此对象的存储空间内,将对象中的所有基本类型设置默认值,引用类型设置为null
5.执行所有出现于字段定义处的初始化动作
6.执行构造器。
六.类的加载编译运行过程
https://www.cnblogs.com/fefjay/p/6305499.html
七.内存分配
http://www.cnblogs.com/dolphin0520/p/3613043.html
八.垃圾回收机制
http://www.cnblogs.com/dolphin0520/p/3613043.html
https://www.cnblogs.com/andy-zcx/p/5522836.html
九.内部类
http://www.cnblogs.com/dolphin0520/p/3811445.html
十.反射
类型信息在运行时是由class对象来表示的。Class包含了类有关的信息,每一个类都有一个Class对象,JVM运行java文件生成class文件时,就生成了Class对象。
获取Class对象的引用:
1.forName()方法:
public static Class<?> forName(String className)
2.类字面常量:
类名.class
建议使用此类型,因为它在编译时就会接受检查。
运行时识别对象和类的信息,主要有两个方式:
1.传统的RTTI(Run-Time Type Identification),运行时类型识别。假设在编译时已经知道了所有类型。
传统的RTTI一般由继承和多态来实现,在运行时通过调用超类的方法来实现具体的功能。
传统的RTTI有3种实现方式:
1) 向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父类转成子类)需要强制类型转换
2) Class对象(用了Class对象,不代表就是反射,如果只是用Class对象cast成指定的类,那就还是传统的RTTI,因为cast()方法使用了isInstance()方法判断类型)
3) instanceof或Class类定义的方法isInstance()
2.反射机制,在运行时发现和使用类的信息。
传统的RTTI方式可以让我们在运行时识别对象的类型。但是这个是在编译器已经知道了所有类型的基础下,即已经生成了.class文件。如果我们获取了一个对象的引用,但是编译器不知道这个对象所属的类,即没有生成.class文件,这个时候就需要使用反射机制了。
Java不允许在运行时改变程序结构或类型变量的结构,但它允许在运行时去探知、加载、调用在编译期完全未知的class,可以在运行时加载该class,生成实例对象(instance object),调用method,或对field赋值。这种类似于“看透”了class的特性被称为反射(Reflection)
Class类与java.lang.reflect类库一起对反射的概念进行了支持。
https://www.cnblogs.com/zhguang/p/3091378.html
十一.IO系统
IO: https://blog.csdn.net/suifeng3051/article/details/48344587
NIO:
https://blog.csdn.net/suifeng3051/article/details/48344587