我们可以把对象的引用传递给Java方法,那么怎么证明Java中方法参数的传递方式是按值调用,而不是按引用传递呢?
public class CallByValueTest { public static void main (String[] args) { howToProveJavaIsCallByValue(); } /** * 如何证明Java是按值传递的,而不是按引用传递的! * 交换逻辑并没有实现。 */ private static void howToProveJavaIsCallByValue(){ A a1 = new A("a1"); A a2 = new A("a2"); swap(a1, a2); System.out.println(a1 + ", " + a2); } private static void swap(A a1, A a2){ A temp = a1; a1 = a2; a2 = temp; } static class A{ String name; private A (String name) { this.name = name; } @Override public String toString () { return this.name; } } }
答案:不可以,final域必须显示地初始化。
public class ObjectInitialization { static{ a = 2; } static int a; { i = 2; } int i; public static void main (String[] args) { System.out.println(a); System.out.println(new ObjectInitialization().i); } } class A{ int a; private A () {} }
答案:可以。
下面的代码,a的值是?
static{ a = 2; } static int a = 1;
答案:1
下面的代码,a的值是?
static{ a = 2; } static int a = 1; static{ a = 3; }
答案:3
总结:初始化和赋值语句是按照类定义顺序执行,后面的赋值覆盖前面的!
答案:不可以,一条import语句只能导入一个包。
答案:编译期。字节码中已经全部按照全路径名来引用其他类了。
答案:可以。
// 导入特定静态方法 import static java.util.Objects.compare; // 导入特定静态域 import static java.lang.Math.E; // 导入该类的所有静态方法和静态域 import static java.lang.Math.*;
答案:不是。Jar是以ZIP压缩格式为基础的。