Java 重载(Overload)
存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。
应该注意的是,返回值不同,其它都相同不算是重载。
实例
class A { public String show(D obj) { return ("A and D"); }
public String show(A obj) {
return ("A and A");
}
}
class B extends A { public String show(B obj) { return ("B and B"); }
public String show(A obj) {
return ("B and A");
}
}
class C extends B { }
class D extends B { } public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); // A and A
System.out.println(a1.show(c)); // A and A
System.out.println(a1.show(d)); // A and D
System.out.println(a2.show(b)); // B and A
System.out.println(a2.show(c)); // B and A
System.out.println(a2.show(d)); // A and D
System.out.println(b.show(b)); // B and B
System.out.println(b.show(c)); // B and B
System.out.println(b.show(d)); // A and D
}
}
涉及到重写时,方法调用的优先级为:
this.show(O) super.show(O) this.show((super)O) super.show((super)O)
Java中的变量和方法初始化顺序
静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。
public static String staticField = "静态变量"; static { System.out.println("静态语句块"); } public String field = "实例变量"; { System.out.println("普通语句块"); }
最后才是构造函数的初始化。
public InitialOrderTest() { System.out.println("构造函数"); }
存在继承的情况下,初始化顺序为:
父类(静态变量、静态语句块) 子类(静态变量、静态语句块) 父类(实例变量、普通语句块) 父类(构造函数) 子类(实例变量、普通语句块) 子类(构造函数)