byte/8
short/16
char/16
int/32
float/32
long/64
double/64
boolean / ?
jvm编译时会将Boolean用int表示,1真0假
每种基本数据类型都有对应的包装类,把基本数据类型转为包装类的过程称为装箱,反之称为拆箱。
new Integer(123)会创建一个对象,多次new会得到不同的对象。
Integer.valueOf(123)会尝试从缓存池里获取数据,如果没有则创建并加到缓存池。多次使用会得到同一对象的引用。自动装箱会调用valueof方法。
String类定义为final,不可继承,Java8中,String使用char数组存储。Java9之后使用byte数组存储,并添加coder变量标识编码方式。
1.便于获取hash值,创建的时候就计算,后续不需要重新计算
2.String pool需要,字符串池可以节省空间,String不可变才可实现
3.安全,String 经常作为参数,String 不可变性可以保证参数不可变
4.线程安全,String不可变就天生具有线程安全
StringBuilder线程不安全
StringBuffer线程安全,内部使用synchronize关键字进行同步
按值传递。基本数据类型就不用说了。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。
普通变量:初始化后不可更改
引用:初始化后不可更改指向,但可以更改引用对象本身的值
方法:不可重写(子类有签名相同的方法等同于新建方法)
类:不可继承
变量:属于类,所有实例对象共享,可以通过类名直接访问
方法:不依赖任何实例,不可用this/super,可通过类名直接访问,内部只能访问静态变量
代码块:只在加载前运行一次(先于构造函数)
内部类:可以不依靠外部类的实例而创建
导包:使用静态变量和方法时可以不指定类名(可读性降低,不推荐)
存在继承的情况下,初始化顺序为:
父类(静态变量、静态语句块)子类(静态变量、静态语句块)父类(实例变量、普通语句块)父类(构造函数)子类(实例变量、普通语句块)子类(构造函数)同:
1.不能被实例化
2.都包含抽象方法
异:
1.抽象类只能单继承,接口可以多继承
2.接口没有构造函数,抽象类有
3.接口的成员变量需要是static final的