1、 java中方法的重写的两同两小一大原则
方法名相同
参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
2、Class.forName(); 类.class; 对象.getClass();
Class.forName() 的形式会装入类并做类的静态初始化,返回 Class 对象。
类.class 的形式会使 JVM 将使用类装载器将类装入内存(前提是类还没有装入内存),不做类的初始化工作,返回 Class 对象。
getClass() 的形式返回运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象 。
getClass()是动态的,其余是静态的。
类.class和class.forName()只能返回类内field的默认值,getClass可以返回当前对象中field的最新值
Class.forName() 返回的是一个类, newInstance() 后才创建一个对象,Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的
参考:https://www.cnblogs.com/feiyun126/p/3229492.html
3、Java类加载的过程
当Java程序需要使用某个类时,如果该类还未被加载到内存中,JVM会通过加载、链接(验证、准备和解析)、初始化三个步骤来对该类进行初始化。
1、 加载:查找和导入Class文件
类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。
2、链接:其中解析步骤是可以选择的
a)检查:检查载入的class文件数据的正确性
b)准备:给类的静态变量分配存储空间
c)解析:将符号引用转成直接引用
3、初始化:对静态变量,静态代码块执行初始化工作
1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
2)如果类中存在初始化语句,就依次执行这些初始化语句。
参考:https://blog.csdn.net/xuemengrui12/article/details/82707473
4、Java io流
按照流的流向:输入流和输出流。注意:这里的输入、输出是相对于内存而言的。
按处理数据单位不同分为字节流和字符流。
字节流:每次读取(写出)一个字节,当传输的资源文件有中文时,就会出现乱码。
字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文。
按照流的角色划分为节点流和处理流。
节点流:从或向一个特定的地方(节点)读写数据。如FileInputStream。
处理流(包装流):是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
参考:https://baijiahao.baidu.com/s?id=1659851047751244423&wfr=spider&for=pc
5、Java字节流与字符流的区别
字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的;
字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
使用场景
字节流一般用来处理图像,视频,以及PPT,Word类型的文件。
字符流一般用于处理纯文本类型的文件,如TXT文件等。
字节流可以用来处理纯文本文件,但是字符流不能用于处理图像视频等非文本类型的文件。
Java IO 流的整体架构图:
参考:https://baijiahao.baidu.com/s?id=1659851047751244423&wfr=spider&for=pc