工作一年多了,java基础只是能用,好多基础都忘了,现在开篇博客,记录下那些年我遗忘的知识点或者模糊不清的知识点。小白,各位大佬如果发现错误请指出。
一、
1、一字节(byte)=8比特(bit)
2、基础类型大小
类型 | 字节 |
---|---|
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
boolean | 1 |
char | 2 |
3、JVM分区:
- 寄存器
- 本地方法栈:jvm调用系统中的功能
- 方法栈:所有方法运行的时候,进入的内存
- 堆:容器和对象
- 方法和数据共享:运行时.class进入的地方
4、重写和重载的区别:
- 重写(override):继承,子类方法和父类方法命名、参数、返回值一致,子类覆盖父类方法
- 重载(overload):类的多态性的表现。一个类中方法重名,参数类型不一致或者顺序不一致
5、JVM加载类的过程
- 加载:通过类的全限定名来获取此类的二进制字节流,将字节流所代表的静态存储结构转化为方法区运行时的数据结构。在内存中生成一个代表这个类的.class对象
- 连接:
- 验证:先确保上一步中被加载的字节流中包含的信息符合当前虚拟机的要求,并且不会危害到虚拟机自身的安全。
- 准备:为类的static修饰的静态变量分配内存,并赋默认值(注:如果final修饰则赋初值)
- 解析:将符号引号替换为直接引用,将字面量改为直接指向方法区内存地址的指针
- 初始化
-
为静态变量赋初值(没错,你没有看错!上上步中是给静态变量赋默认值,也就是说这个变量系统默认的值,到现在才开始 给这个变量赋上你想要它成为的值):静态变量初始化或者静态代码中给静态变量赋值
- clinit和init
-
clinit:有static时才会生成该方法,此方法只执行一次,为静态变量初始化和静态块的执行。init:先为实例变量分配内存,再赋*默认值*,再根据代码总顺序赋初值。
- 使用:
- 卸载:执行system.exit()
6、抽象类是这个事物中应该具备的内容,接口是这个事物的额外功能。优先使用接口。
-
抽象:抽象方法必须在抽象类中。和抽象类都要用abstract修饰。抽象类没没有主体,所以不能实例化对象(不能new),使用继承,子类必须覆盖该类的所有方式才可以实例化对象,否则该子类还是抽象类。抽象类一定是个父类,可以不定义抽象方法。抽象类只能单继承。
-
接口:接口编译完仍会生成.class文件。不能定义带有方法体的方法,抽象方法定义有固定格式public abstract 返回值类型 方法名(参数列表);接口中无法定义普通成员变量,必须为常量,格式public static final 数据类型 变量名 = 值。接口可以多实现,多实现没有安全隐患,因为接口中的方法都是没有实体的,都需要去重写,不存在方法重复问题。***java中没有多继承,但是接口有多继承。***
7、多态:
- 成员变量,编译的时候,参考父类中是否存在该变量,如果没有编译失败。运行时,运行的是父类中变量值。成员方法:编译时:参考父类是否存在该方法,若无编译失败。运行时,运行子类的重写方法。
- 向上转型(类型范围小的转范围大的):Fu f = new Zi();优点:可以调用公共方法。缺点:无法调用子类的特有内容。
- 向下转型(类型范围大的转范围小的):最好用Instanceof判断一下,避免出现异常。优点:调用子类的特有功能。