下面两段代码,为什么结果是 Test1 a = 0; Test1 MyString = null; 在这初始化中,我那里写错了?
代码1:
public class Test1{
int a;
String MyString;
public void geta(){};
public void getMyString(){};
}
代码2:
public class Test{
public Test1 test1(final int a, final String MyString){
return new Test1(a, MyString){
private int a;
private String MyString;
{
this.a = a;
this.MyString = MyString;
}
public void geta(){System.out.println("Test1 a = " + a);}
public void getMyString(){System.out.println("Test1 MyString = " + MyString);}
};
}
public static void main(String[] args){
Test test = new Test();
Test1 test1 = test.test1(10,"this is MyString");
test1.geta();
test1.getMyString();
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【llm0528】截止到2008-07-25 22:04:42的历史汇总数据(不包括此帖):
    发帖的总数量:59                       发帖的总分数:1220                     每贴平均分数:20                       
    回帖的总数量:51                       得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:59                       结贴的总分数:1220                     
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    Test1(a, MyString)这个构造方法根本就没有定义.
      

  3.   

    return new Test1(a, MyString)a, MyString 要去掉,否则不能执行!
      

  4.   


    public class Test{
        public Test1 test1(final int b, final String MyString){  //这里改为b
            return new Test1(){
                private int a;
                private String MyString;
                {
                    this.a = b;//这里也改为b ,结果就是10了,这个问题我也不理解,高手解释一下吧
                    this.MyString = MyString;
                }    
                public void geta(){System.out.println("Test1 a = " + a);}
                public void getMyString(){System.out.println("Test1 MyString = " + MyString);}
            };
        }
        public static void main(String[] args){
            Test test = new Test();
            Test1 test1 = test.test1(10,"this is MyString");
            test1.geta();
            test1.getMyString();
        }
    }
      

  5.   

    这个容易理解,因为内部类里面有private int a;的定义,它把public Test1 test1(final int b, final String MyString)这个方法中的a屏蔽掉了.楼主原来是想return new Test1(a, MyString)在这把a传进去,这里其实就调用了父类中的构造方法,但是父类中没有这个构造方法,所以应该不会通过编译,这里就不知道楼主是怎么得到结果的了.
      

  6.   

    真的~~ 只要修改2个名字就能得到想要的结果,我晕,我试了好几个方法,主要是修改Test1(代码贴在结尾处)
    我写这代码主要是验证下,初始化块在匿名类里是不是真的能起到初始化的作用,至于为什么修改名字就能得到想要的结果,还望高手能够作出解答~~

    public class Test{
    public Test1 test1(final int b, final String MyString2){
    return new Test1(){
    private int a;
    private String MyString;
    {
    a = b; //修改处
    MyString = MyString2; //修改处
    }
    public void geta(){System.out.println("Test1 a = " + a);}
    public void getMyString(){System.out.println("Test1 MyString = " + MyString);}
    };
    }
    public static void main(String[] args){
    Test test = new Test();
    Test1 test1 = test.test1(10,"this is MyString");
    test1.geta();
    test1.getMyString();
    }
    }Test1代码:
    public class Test1{
    int a;
    String MyString;
    Test1(int a, String MyString){
    this.a = a;
    this.MyString = MyString;
    }
    public void geta(){};
    public void getMyString(){};
    }
      

  7.   

    如果想通过构造方法来初始化变量的话,那么父类中已经定义了int a;
        String MyString;
    子类就没有必要再定义了,而且即使父类构造方法正确的添加了,初始化的也是父类中声明的变量.对这个例子还是没有意义的.
      

  8.   

    可能贴的时候我已经又做除了另一种可能吧,原来的Test1里我是又写父类的构造器的,11楼的Test1是对应1楼的Test类的
      

  9.   

    只要内部类中定义的private int a;
                private String MyString;
    和外面方法中的变量不同名就可以了.
      

  10.   

    Anonymous classes are simple and direct but can easily become very hard to read. The further they nest, the harder they are to understand. The nesting of the anonymous class code that will execute in the future inside the method code that is executing now adds to the potential for confusion. You should probably avoid anonymous classes that are longer than about six lines, and you should use them in only the simplest of expressions.