JVM中boolean数组是通过读写byte数组实现的
自动装箱与拆箱用了xxx.valueOf()和.xxxValue(),new Integer(3)不是自动装箱,=3才是。也因为自动装箱用了valueOf,所以会使用缓存池。
String在Java8用char数组,Java9用byte数组并保存编码格式
String不可变的其中一个好处是可以使用String pool
String.intern()从string pool里找有没有这个string,没有就加进去,然后返回引用,用 a=b.intern()可以获得相同的字符串(完全同一个,不是仅值相等)。String a = “asd”这种直接赋值的,赋值时就给放池里了,=new String(“asd”)这种才会在intern时出现往里放的情况。
浮点数字面量是double类型,所以不能float a = 1.1;
Private和final的方法不能被重写,所以如果子类有同名的,其实是新的方法,不是重写的。
Final类不能被继承。
Static的任何都不应该与对象有关,所以方法中不能出现this,super之类的东西。因为不依赖对象和具体实现,所以不能是虚的,必须有实现。(虽然实现空的是可以,就{})
toString默认返回“类名@散列码的无符号十六进制表示”
clone是protected,所以必须显式重写才能让别的类使用。还得实现clonable接口。
浅拷贝:只能拷贝最外部一层,深层的对象,依然是通过引用指向同一块堆内存。
深拷贝把所有对象都clone一遍,对象的引用不同了
子类对象必须能替换掉父类对象。子类的声明必须比父类大,比如父类Protected,子类就protected或者public。声明,返回值和异常类型都要考虑到,返回值和异常类型要是父类的子类,这样用 Father a = new Child();时,a.method的返回值就能满足父类的返回值,因为虽然返回的是子类的返回值,但是这个值是一种父类返回值的特殊情况。
Java8之后,接口也可以有默认的方法实现。接口的所有成员都是public的。接口的字段默认都是static和final的。抽象类没有接口这些成员和字段的限制。
子类一定会调用父类的构造函数。
Java8开始接口可以有方法实现
重载返回值可以不同,但是不能仅以返回值不同区分函数。
反射,Field,Method,Constructor,缺点是性能开销大,不安全,暴露内部(这同时换种方式说也能算是优点)
Array不能用泛型,List可以
泛型的非限定通配符?,限定通配符super和extends