看这个程序:
interface Destinations{
String readLabel();
}
public class Parcel9 {
    public Destinations destiantions(final String dest){
     return new Destinations(){
     private String label = dest;
     public int i = 4;
     {
     System.out.println(label);
     System.out.println(i);
     }
     public String readLabel(){
     return label;
     }
     public void  f(){
     System.out.println(i);
     }
     };
    }
    public static void main(String[]args){
     Parcel9 p = new Parcel9();
     Destinations d = p.destiantions("Tasmania");
    }
}
其中:
请问:
public int i = 4; 这个i怎么能正确初始化呢 这个匿名内部类并没有构造方法啊 只有当调用构造方法时才会执行对象的初始化的啊 “i” 应该为默认值0啊
谢谢

解决方案 »

  1.   

    无法初始化,即使是默认值0都无法访问该变量。
    匿名类中的新增成员变量和方法即使访问权限是public的
    外部也无法调用。只能在匿名类内部当作私有方法调用。
    就像上面程序中的 i和方法f(),在该匿名类外部是无法被访问到的。
    如果想初始化的话,只能在外部对象可以访问到的方法 readLabel()里进行初始化。
      

  2.   

    谁说只有当调用构造方法时才会执行对象的初始化?那我没有显示构造方法,默认构造方法也为空,我就不能自己定义实例域吗?
    public int i = 4;lz你这句不就是给i赋值吗? 这还用啥构造方法啊?我声明一个变量int a = 5;你能说这句不写在构造方法里面,a的值就不是5了?不要这么死心眼...
      

  3.   


        //这里实际上JVM给i分配空间的同时就已经让它指向一个内存地址了
    public int i = 4; 
    {
        //当然如果上面写成 public int i;
        //这里i=4;
        //不就是把上面的一步分成2步而已嘛,实际上JVM还是会分2步执,先初始化,再赋值!
        System.out.println(label); 
        System.out.println(i); 

      

  4.   

    只能在外部对象可以访问到的方法 readLabel()里进行初始化。
      

  5.   

    java规定如果类成员不使用构造函数初始化,那么有些固定类型的成员java编译器可以自己进行初始化。比如lz程序中的public int i = 4;语句。成员i的初始化就是由java编译器完成的,而不是由该类的构造函数进行初始化的。
      

  6.   


    public int i = 4; ?//这个i不是初始化了么??
      

  7.   

    destiantions开始被调用的时候,你传进来的dest已经是这个方法内部变量,是不可变的,final的
    这同等于尼实力化这个匿名类之前已经对这个类的label成员已经初始化了,可以把这个看成 static 的,最先给它初始化,所以会打印出4
    这个跟这个格式是不一样的
    interface Destinations {    String readLabel();
    }class DestinationsImpl implements Destinations {    private String label;    public int i = 4;
        {
            System.out.println(label);
            System.out.println(i);
        }    public DestinationsImpl(String dest) {
            label = dest;
        }    public String readLabel() {
            return label;
        }    public void f() {
            System.out.println(i);
        }
    }public class E {    public Destinations destiantions(final String dest) {
            return new DestinationsImpl(dest);
        }    public static void main(String[] args) {
            E p = new E();
            Destinations d = p.destiantions("Tasmania");
        }
    }
      

  8.   

    对于Type new Destinations(){}而言
    这就是匿名内部类模拟构造方法的初始化方式
     
      

  9.   

    对象在创建的时候就执行初始化(该类被加载就会初始化成员变量为默认值,为它们分配空间,静态的只初始化一次,不一定是生成对象的时候) 如果没有赋另外的值 则使用默认值 不一定要使用构造器(new Destinations(),你这样不就使用了默认构造方法嘛,里面没有对成员变量再赋值的话,那就是默认的)
      

  10.   

    private String label = dest;这句话比较别扭,因为这种情况只存在于匿名内部类。
    按常理这里应该是条执行语句,不是定义,应该放在{}中吧,但是直接这样也可以。希望谁解释一下。
      

  11.   

    public int i = 4; 这个i怎么能正确初始化呢 这个匿名内部类并没有构造方法啊 只有当调用构造方法时才会执行对象的初始化的啊 “i” 应该为默认值0啊 这句话本身就有问题 不是只有当调用构造方法时才会执行对象的初始化
    是在实例化之前进行初始化,你这里已经创建了一个匿名类的实例 那他自然就初始化了
      

  12.   

     { 
        System.out.println(label); 
        System.out.println(i); 
        } 在这个块中加一行代码   System.out.println(this.getClass());控制台会打印出: class sdasda.so.Parcel9$1Parcel9$1 可能就是你起的匿名类的名字吧,注意只是可能是
      

  13.   


    不是可能,而是肯定。大家可以看看编译好的class文件,就知道了。这个名字是不能被我们的代码访问的而已。