JVM JDK JRE
JVM:运行Java字节码的虚拟机,针对不同系统的特定实现(JVM可以理解代码叫做字节码 扩展名.class)
JDK:包含JVM和JRE,能够创建和编译Java程序的开发套件
JRE:Java运行时的环境
Java 和 c++区别
java和c++都是面向对象编程。
(1)java是单继承机制,c++可以多继承。
(2)java不提供指针来访问内存,程序内存更加安全
(3)java有自动回收机制,不需要程序员手动释放无用内存
(4)c++同时支持方法重载和操作符重载。java只支持方法重载
Java的几种基本数据类型
四种整数类型:byte(1) short(2) int(4) long(8)
两种浮点类型:float(4) double(8)
一种布尔类型:boolean
一种字符类型:char(2)
基本类型和包装类型
包装类型的缓存机制
Byte,Short,Integer,Long四种包装类型默认创建了数值[-128,127]的相应类型的缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean直接返回True or False。如果超出了缓存数值的值再去创建新的对象,否则直接使用缓存中的对象。
自动装箱拆箱
装箱:将基本类型用他们对应的引用类型包装起来
拆箱:将包装类型转换为基本数据类型
例如:第一行这个代码会发生装箱,等价于第二行代码
第三行这个代码会发生拆箱,等价于第四行代码(编译过程)
Integer i1 = 40;
Integer i1 = Integer.valueof(40);
int n = i1;
int n = i1.intValue();
String StringBuilder StringBuffer的区别
StringBuilder和StringBuffer都继承自AbstractStringBuilder,这个抽象类并没有被final修饰,StringBuilder和StringBuffer被final修饰。在AbstractStringBuilder中是由字符数组来保存字符串的。String中的对象是不可变的,保证了线程安全。StringBuilder不保证线程安全,StringBuffer对方法或调用的方法加了同步锁保证了线程安全。
StringBuilder和StringBuffer方法在使用无参构造器时:默认初始容量是16的字符缓冲区。
String不可变的原因
因为String被final关键字修饰,被final关键字修饰的变量值不可以改变,方法不能被重写,类不能被继承,引用类型不能改变引用对象。由于保存String的字符串数组(引用类型)是被final修饰,并且没有提供公开的修改方法,因此String是不可变的。
重载和重写
重载
同样的一个方法能够根据不同的输入数据做出不同的处理
要求:同一个类或者父类和子类之间,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和修饰符可以不同
重写
子类继承父类的相同方法,输入数据一样,但要做出和父类不一样的行为
要求:方法名、参数列表必须一样,子类的返回值类型应该小于等于父类的返回类型,子类的修饰符应该大于等于父类,抛出的异常应该小于等于父类
类加载过程
类加载的过程主要分为三步 加载 连接 初始化
加载:将.class的二进制字节流加载到内存中,并且在堆内存中创建一个class对象
连接:分为 验证 准备 解析。验证:是否满足JVM的规范。准备:为类的类变量开辟空间,为其中的变量赋初始值,基本变量为0,引用变量为null。解析:将字符串引用解析为直接
初始化:为类的类变量赋初始化值。
类加载器
自定义类加载器 application classloder extension classloader bootstrap classloader
双亲委派模型
非顶层的类加载器在加载类时,向上传递直到顶层,如果顶层可以加载则加载,如果不可以再向下遍历。