分析:
JAVA重载解析过程分为2步:
(1)根据实参选取所有可应用的。
(2)根据形参选取最精确的。(并没有使用实参)
比如:
如果fun(Object o)和fun(double[]b)都是可应用的,则double[]的每个对象都是Object类型的,因此double[]比Object更精确。
每个静态的属性都在声明他的类和所有的子类中保持一个副本。
静态方法调用不是动态的,因此如果调用一个静态方法,则在编译器执行期已经确定。
比如:Person p = new Student();p.say();如果say是静态方法,则调用的是Person类的静态方法。
比如:(Person)null.say();调用的是Person.say(),null不起任何作用。
总结:调用静态方法时,必须使用类来调用,而不是用类的实例进行调用。
示例2:
类初始化顺序:
(1)把静态字段设置为默认值。
(2)静态字段初始器按照其在源代码中出现顺序执行,比如static属性、final static属性、static语句块等,因此会出现调用还没有被初始器初始化的静态字段,尽量把属性都放在类的前面。
(3)在执行类的方法前,必须对类进行初始化。
积极初始化和延迟初始化:不要同时使用两者。
当在程序每次执行都会用到时,则使用积极初始化。
当不是每次执行都会用到时,则使用延迟初始化。
结论:类的初始化顺序显得重要时,请特别当心!
比较两个程序:
示例2:
(1)如果instanceof的左操作数是null,则返回false;
(2)如果两个操作数的类型都是类,则instanceof的左右操作数一定是子类或父类关系;
JAVA语言规范:不允许一个局部变量声明语句作为一条语句在for、while、do循环中重复执行。
因此一个局部变量声明语句只能出现在一个语句块中。