异常
-
异常体系的最上层是Throwable类 子类有Error和Exception Exception的子类又有RuntimeException和其他具体的可检查异常。
-
Error是jvm完全无法处理的系统错误,只能终止运行。 运行时异常指的是编译正确但运行错误的异常,如数组越界异常,一般是人为失误导致的,这种异常不用try catch,而是需要程序员自己检查。 可检查异常一般是jvm处理不了的一些异常,但是又经常会发生,比如Ioexception,Sqlexception等,是外部实现带来的异常。
-
多线程的异常流程是独立的,互不影响。大型模块的子模块异常一般需要重新封装成外部异常再次抛出,否则只能看到最外层异常信息,难以进行调试。 日志框架是异常报告的最好帮手,log4j,slf4j中,在工作中必不可少。
泛型
-
Java中的泛型是伪泛型,只在编译期生效,运行期自动进行泛型擦除,将泛型替换为实际上传入的类型。 泛型类用classA { }
-
这样的形式表示,里面的方法和成员变量都可以用T来表示类型。泛型接口也是类似的,不过泛型类实现泛型接口时可以选择注入实际类型或者是继续使用泛型。
-
泛型方法可以自带泛型比如void go(); 泛型可以使用?通配符进行泛化 Object可以接受任何类型 也可以使用 这种方式进行上下边界的限制。
Class类和Object类
-
Java反射的基础是Class类,该类封装所有其他类的类型信息,并且在每个类加载后在堆区生成每个类的一个Class<类名>实例,用于该类的实例化。
-
Java中可以通过多种方式获取Class类型,比如A.class,new A().getClass()方法以及Class.forName("com.?.?.A")方法。
-
Object是所有类的父类,有着自己的一些私有方法,以及被所有类继承的9大方法。
知乎上有人讨论Object和Class类型谁先加载谁后加载,因为每个类都要继承Object,但是又得先被加载到堆区,事实上,这个问题在JVM初始化时就解决了,没必要多想。
javac和java
-
javac 是编译一个java文件的基本命令,通过不同参数可以完成各种配置,比如导入其他类,指定编译路径等。
-
java是执行一个java文件的基本命令,通过参数配置可以以不同方式执行一个java程序或者是一个jar包。
-
javap是一个class文件的反编译程序,可以获取class文件的反编译结果,甚至是jvm执行程序的每一步代码实现。
反射
-
Java反射包reflection提供对Class,Method,field,constructor1 等信息的封装类型。
-
通过这些api可以轻易获得一个类的各种信息并且可以进行实例化,方法调用等。
类中的private参数可以通过setaccessible方法强制获取。
- 反射的作用可谓是博大精深,JDK动态代理生成代理类的字节码后,首先把这个类通过defineclass定义成一个类,然后用class.for(name)会把该类加载到jvm,之后我们就可以通过,A.class.GetMethod()获取其方法,然后通过invoke调用其方法,在调用这个方法时,实际上会通过被代理类的引用再去调用原方法。
枚举类
-
枚举类继承Enum并且每个枚举类的实例都是唯一的。
-
枚举类可以用于封装一组常量,取值从这组常量中取,比如一周的七天,一年的十二个月。
-
枚举类的底层实现其实是语法糖,每个实例可以被转化成内部类。并且使用静态代码块进行初始化,同时保证内部成员变量不可变。
序列化
- 序列化的类要实现serializable接口
transient修饰符可以保证某个成员变量不被序列化
readObject和writeOject来实现实例的写入和读取。
- 事实上,一些拥有数组变量的类都会把数组设为transient修饰,这样的话不会对整个数组进行序列化,而是利用专门的方法将有数据的数组范围进行序列化,以便节省空间。
为方便大家学习可以跟着 [适合0基础学习Java的教学视频](为方便大家学习可以跟着 适合0基础学习Java的教学视频 来跟着一起学习) 来跟着一起学习