Java 拾遗(二)

来源:互联网 发布:个人怎么在淘宝卖东西 编辑:程序博客网 时间:2024/05/02 11:13
  • 方法的重载的注意事项:
  1. 其实规则很简单:每个重载方法都必须有一个独一无二的参数类型列表。可以是不同的参数类型、不同的参数个数,甚至不同的参数顺序。
  2. 涉及基本类型的重载:基本类型可以从一个“较小”的类型自动提升至一个“较大”的类型,在重载时需要注意。例如:如果方法的参数中有 char 类型,则调用 char 类型参数时,则使用此方法;若没有 char 类型的方法,则 char 可以依次提升为 int\long\float\double。对于 byte 类型依次提升为 short\int\long\float\double。对于 short 类型依次提升为 int\long\float\double。对于 int 类型依次提升为 long\float\doble。对于 long 类型依次提升为 float\double。对于 float 类型依次提升为 double。再强调一下 char 类型是直接提升为 int 类型以后再依次提升。
  3. 以返回值区分重载方法是行不通的。

  • 构造器:如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。

  • 在 Java 中,“初始化”和“创建”捆绑在一起,两者不能分离。

  • Java 初始化顺序:

下面的程序是我经过一番斟酌设计出来的,主要目的就是展现出 Java 初始化和运行的过程:

 

class ZA {    public ZA() {        System.out.println("In ZA constructor");    }        {    System.out.println("General field in ZA");     }        static {    System.out.println("Static field in ZA");    }}class ZB extends ZA {    public ZB() {        System.out.println("In ZB(extends ZA) constructor");    }        {    System.out.println("General field in ZB(extends ZA)");     }        static {    System.out.println("Static field in ZB(extends ZA)");    }}//===========================================================================class ElseA {    public ElseA() {        System.out.println("In ElseA constructor");    }        {    System.out.println("General field in ElseA");     }        static {    System.out.println("Static field in ElseA");    }}class ElseB extends ElseA {    public ElseB() {        System.out.println("In ElseB(extends ElseA) constructor");    }        {    System.out.println("General field in ElseB(extends ElseA)");     }        static {    System.out.println("Static field in ElseB(extends ElseA)");    }}//===========================================================================class C {C(int marker) {System.out.println("C(" + marker + ")");}void f(int marker) {System.out.println("f(" + marker + ")");}}class Cs {static C c1=new C(1);static C c2=new C(2);Cs() {System.out.println("Cs()");}}//===========================================================================public class InitialOrder extends ZB {public static void main(String[] args) {System.out.println("Start [public static void main() in InitialOrder(extends ZB)]");ZB zb = new ZB();ZA za = new ZA();ElseB eb = new ElseB();ElseA ea = new ElseA();Cs.c1.f(23);}{    System.out.println("General field in InitialOrder(extends ZB)");     }    static {    System.out.println("Static field in InitialOrder(extends ZB)");    }}

大家在看下面的答案之前可以先思考一下该程序的输出结果。输出结果如下:

Static field in ZAStatic field in ZB(extends ZA)Static field in InitialOrder(extends ZB)Start [public static void main() in InitialOrder(extends ZB)]General field in ZAIn ZA constructorGeneral field in ZB(extends ZA)In ZB(extends ZA) constructorGeneral field in ZAIn ZA constructorStatic field in ElseAStatic field in ElseB(extends ElseA)General field in ElseAIn ElseA constructorGeneral field in ElseB(extends ElseA)In ElseB(extends ElseA) constructorGeneral field in ElseAIn ElseA constructorC(1)C(2)f(23)

这个程序清晰的展示了有继承、组合和静态域下 Java 的初始化顺序。其中文字性的细述,我就略去了。希望读者可以通过该程序和程序的运行结果自行总结。不过可以简单给出几点注意的问题:

  1. 在类的内部,域会在任何方法(包括构造器)调用之前得到初始化;
  2. 静态域(静态块)只能执行一次;
  3. 所有静态域会同时得到初始化,不会只初始化其中某一个;

0 0
原创粉丝点击