Java 解惑知多少五
类
34. 参数兼容的方法重载
public class Confusing { private Confusing(Object o) { System.out.println("Object"); } private Confusing(double[] dArr) { System.out.println("double array"); } public static void main(String[] args) { new Confusing(null); } }
class A1 { public static void f() { System.out.println("A1.f()"); } } class A2 extends A1 { public static void f() { System.out.println("A2.f()"); } } class T { public static void main(String[] args) { A1 a1 = new A1(); A1 a2 = new A2(); // 静态方法不具有多态效果,它是根据引用声明类型来调用 a1.f();// A1.f() a2.f();// A1.f() } }
class P { public String name = "P"; } class S extends P { // 隐藏父类的name域,而不像方法属于重写 private String name = "S"; } public class Test { public static void main(String[] args) { // !! S.name is not visible // !! System.out.println(new S().name); // 属性不能被重写,只是被隐藏,所以不具有多态性为 System.out.println(((P) new S()).name);// p } }
class X { static class Y { static String Z = "Black"; } static C Y = new C(); } class C { String Z = "White"; } public class T { public static void main(String[] args) { System.out.println(X.Y.Z);// White System.out.println(((X.Y) null).Z);// Black } }
package click; public class P { public void f() { //因为子类没有重写该方法,所以调用的还是父类中的方法 prt(); } void prt() { System.out.println("P"); } } package hack; import click.P; public class T { private static class S extends P { // 这里没有重写父类的方法,因为父类方法不可见 void prt() { System.out.println("S"); } } public static void main(String[] args) { new S().f();// P } }
public class P{ public void f(){} } class S extends P{ public void f(){}//重写 }
class P { public static final String str = "P"; } class S extends P { //编译能通过。可以是final,这里属于隐藏 public static final String str = "S"; public static void main(String[] args) { System.out.println(S.str);//s } }
public class P{ public static void f(){} } class S extends P{ //隐藏,不会继承P.f() public static void f(){} }
public class T{ public static void f(int i){} public static void f(String str){}//重载 }
public class T { private static String str = "feild"; public static void main(String[] args) { String str = "local";// 遮蔽 System.out.println(str);// local // 可以通过适当的方式来指定 System.out.println(T.str);// feild } } public class T { private final int size; // 参数属于方法局部范围类变量,遮蔽了同名成员变量 public T(int size) { //使用适当的引用来指定 this.size = size; } }
public class T { static String System; public static void main(String[] args) { // !!不能编译,遮掩 java.lang.System // !! System.out.println("Hello"); // 可明确指定 java.lang.System.out.println("Hello"); } }
class T { // 先于静态常量t初始化,固可以在构造器中正常使用 private static final int y = getY(); /* * 严格按照静态常量声明的先后顺来初始化:即t初始 * 化完后,才初始化后面的静态常量j,所以构造器中 * 引用后面的静态常量j时,会是0,即内存清零时的值 */ public static final T t = new T(); // 后于静态常量t初始化,不能在构造器中正常使用 private static final int j = getJ(); private final int i; static int getY() { return 2; } static int getJ() { return 2; } // 单例 private T() { i = y - j - 1; //为什么j不是2 System.out.println("y=" + y + " j=" + j);// y=2 j=0 } public int getI() { return i; } public static void main(String[] args) { System.out.println(T.t.getI());// 1 System.out.println(T.j);// 2 } }
class T { private final static int i = getJ(); private final static int j; static { j = 2; } static int getJ() { return j; } public static void main(String[] args) { System.out.println(T.j);// 2 /* * 因为上面的语句已经初使完T类,所以下面语句是 * 不 会 再引起类的初始化,这里的结果用的是第一 * 次( 即上面语句)的初始化结果 */ System.out.println(T.i);// 0 } }