1. 在子类中,关键字super是用来调用父类方法的。不同于this引用,super不是对象的引用(根本就不存在单独的父类对象),而是绕过动态查找方法并调用特定方法的指令。
2. 可以给计划要覆写的方法加上@Override注解,编译器会检查,避免因为不正确的参数列表或者方法名导致异常。
3. 覆写方法时,可以将返回类型改成子类型(协变返回类型)。
4. 覆写一个方法时,子类方法的可见性至少要和父类的方法一样。
5. 子类构造函数中使用super()调用父类构造函数。
6. 声明为final的方法,子类不可以覆写。声明为final的类,不可以被继承。
7. protected赋予包级别访问,他只是保护来自其他包的访问。
8. 方法引用表达式使用super代替对象引用同样有效,super::方法 表示使用this作为接收者调用父类方法。
9. 无论何时,当一个对象和字符串连接时,Java编译器自动调用该对象的toString方法。
10. 数组从Object继承了toString,输出的字符串包含数组的类型,只是形式比较老旧,可以使用Array.toString Array.deppToString(多维数组)代替
11. equals方法判断两个对象引用是否相同
12. 对于基本类型,使用==操作符比较。对于double类型,如果担心无穷或者NaN,使用Double.equals()
13. hashCode方法和equals方法必须兼容。如果x.equals(y)成立,那么x.hashCode()==y.hashCode()也必须成立。
14. Object.Clone()做的是浅拷贝。
15. 标签接口是一个没有任何方法的接口。比如Object.Clone()会检测Croneable接口是否实现。
16. 每个枚举类型都有固定的实例集,永远不需要使用equals方法,直接使用==操作符比较。
17. 枚举类型中,与toStirng方法相反的是valueOf
18. 每一个枚举类型都有一个静态方法values,返回一个按照其声明次序牌理的包含所有枚举实例的数组。
19. ordinal方法实例在枚举声明中的位置,从0开始。
20. 可以给枚举类型添加构造函数,方法和域。枚举类型的构造函数总是私有的。
21. 可以给单个枚举实例添加方法,但只能覆盖枚举类中定义的方法。
22. 枚举类可以拥有静态成员,但要小心构造的次序。由于枚举常量在静态成员之前构建,所以不能在构造函数里引用任何静态成员。解决方案是在一个静态初始化块中进行初始化工作。
23. 枚举类型可以嵌套在一个类中,这样嵌套的枚举类属于隐式的静态嵌套类,他们的方法不能引用外部类的实例变量。
24. 使用 对象.getClass Class.forName() 可以得到类的Class实例。如果提前知道嘞的名称,可以使用 包名.类名.class来直接得到。
25. Java虚拟机为每种类型管理一个唯一的Class实例,因此,可以使用==操作符来比较类实例。
26. Class类的一个有用服务就是定位应用程序可能需要的资源。 类名.class.getResourceAsString()方法可以获取资源。支持相对路径和绝对路径,路径起点为包根目录。
27. 当执行Java程序时,会涉及3个类加载器。
(a)bootstrap,加载Java类库,是java虚拟机的一部分,不可获得。
(b)扩展类加载器,从jre/lib/ext目录加载标准库的扩展部分
(c)系统类加载器,加载应用程序类,它定位classpath目录和JAR文件的类
28. 通过创建自己的URLClassLoader实例,你可以从classpath以外的目录或者JAR文件中加载类
29. Class.forName(className, true, loader) 调用中的第二个参数确保类的静态初始化块发生在加载之后。不要使用ClassLoader.loadClass()方法,它不会执行静态初始化代码块。