1.为了验证实参和形参的区别,运行下面代码:
public class ArgPassTest {
public class MyObject { //此行用public没有报错
public int value = 0;
public MyObject(int a) {
value = a;
}
}
public static void test(MyObject obj) {
obj.value = 20;
obj = new MyObject(30); //报错
}
public static void main(String[] args) {
MyObject A = new MyObject(10); //报错
test(A);
System.out.println(A.value);
}
}
结果是编译就报错No enclosing instance of type ArgPassTest is accessible. Must qualify the allocation with an enclosing instance of type ArgPassTest (e.g. x.new A() where x is an instance of ArgPassTest).
2. 上面的错误原因及修改方法
【错误原因】程序是在静态方法中直接调用动态内部类会报这样错误。 这样的错误好比类中的静态方法不能直接调用动态方法。
【修改方法】可以把该内部类声明为static。或者不要在静态方法中调用。或者把public class MyObject 改成class MyObject 并写在ArgPassTest外面。
3.网上看到的一种有意思的匿名内部类:
package test;
public interface Test {
void a();
}
package test;
public class Test2 {
Test t=new Test(){
public void a() {
System.out.println("调用A方法");
}
};
public static void main(String[] args) {
Test2 t2=new Test2();
t2.t.a();
}
}
//本例中,Test接口被直接实例化,大家知道接口是不能实例化的,必须实现所有的方法,
//在这里Test在实例化的时候后面跟的{}部分就是实例化的部分.
//同理,这个方式可以用于抽象类,或是重写类的某个方法