//注意,本博文不是最终版本,仅记录最新理解。部分内容为推测
1. 方法重载:形参不同即可重载。不导致重载的因素有:
1.1返回值:由于调用者可以可以忽略返回值,可出现二义性
1.2访问修饰符:若有高访问权限的方法来调用,可出现二义性
1.3抛出异常:调用者可忽略异常,可出现二义性
注意:可变长参数与普通参数构成重载,同类型可变长参数不构成重载(不推荐使用可变长参数)
2.类和对象构造相关
2.1为什么没有静态构造器?在Java中,构造器特指实例对象的构造函数,所以没有静态构造器(static constructor)的说法,但是有静态初始化块(static initializer)
2.2实例对象中,父类构造器super默认是本类构造器的第一句。接下来是初始化块的语句,然后是成员赋默认值语句,最后才是本类构造器其他语句
2.3构造顺序和对象状态
2.3.1 静态
2.3.1.1 父类 静态初始化块()
2.3.1.2 父类 静态成员按声明顺序赋默认值(若父类还未被加载)
2.3.1.3 本类 静态初始化块(若本类还未被加载)
2.3.1.4 本类 静态成员按声明顺序赋默认值(若本类还未被加载)
2.3.2 实例
2.3.2.1 父类 构造器
2.3.2.2 本类 构造器的其他剩余部分
2.4构造出错
2.4.1不允许在任何构造块和构造函数中抛出checked异常,因为在代码中无法显式处理此checked异常。Java允许在在构造块和构造函数中抛出unchecked异常,但编译器可能要求必须有一个不抛出任何异常的分支
2.4.2如果在静态构造块抛出异常,这个异常将无法处理
2.4.3如果构造过程出现任何错误,引用将不会被赋值而保留原值
3.内部类:在类中声明的类
3.1 作为外部类的成员
3.1.1 static修饰静态内部类和非静态内部类
3.1.1.1 构造方式:对于static内部类,只要外部类存在/被加载,就可通过new 外部类.内部类构造器来创建对象;对于非static内部类,则需要通过外部类的对象.new 内部类构造器来创建内部类对象。
3.1.2 访问控制:
3.1.2.1 内部类本身作为外部类的成员,内部类所有成员和所有嵌套外部类的所有成员都可以互相访问。
3.1.2.2 作为类的成员,可以用4个访问修饰符修饰(普通的类只能用public和默认修饰),效果和普通成员一致
3.2 作为类本身
3.2.1 abstract修饰
3.2.2 final修饰
3.2.3 外部类访问某个内部类的成员或内部类访问外部类成员时,使用类名.this.成员。注意,此处说明非静态内部类对象隐式持有外部类对象的引用,显式设置外部类对象引用为null并不能被gc,导致内存泄漏。类名.super只指代Object类
3.3 局部内部类:在方法内定义的类,访问范围只有本方法,故无访问修饰符,常用来实现返回值为接口的方法
3.4 匿名内部类:不给定类名称,其他同局部内部类
4.final和immutable
4.1 final:“字面值”不可修改,但引用的对象内容可以修改
4.1.1修饰 类:该类不可被继承
4.1.2修饰 方法:该方法不可被重写
4.1.2修饰 成员变量:必须在构造器中显式初始化,随后不可改变,分配空间时的默认值不算初始化
4.1.3修饰 静态变量:必须在静态初始化块中显式初始化,随后不可改变
4.1.4修饰 局部变量:只能赋值一次,若在编译时可确定值(没访问普通变量),则会被编译器替换成字面常量
4.2 immutable:该类对象内容不可修改,自动将所有成员设置为private final(表明不保证成员引用的对象不可修改)
5.异常:Java共有两种异常
5.1 Error:Java虚拟机无法解决的严重错误,如JVM内部错误,资源耗尽。一般不编写针对性代码进行处理
5.2 Exception:一般性问题,如空指针访问、文件不存在、网络中断等