我们可以把对象的引用传递给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压缩格式为基础的。