谢谢合作:因为我们要讨论一些非常基础的问题。
比如这个问题:
public  class Test {
  public static void main(String[] args) {
    for(int i=1;i<=4;i++){
      try{
        Class cls=Class.forName("Class"+i);
        //如果类在包中,要改为 "package.Class"+i
        java.lang.reflect.Method s=cls.getMethod("print",null);
        s.invoke(cls,null);
        System.out.println();
      }
      catch(Exception e){
        e.printStackTrace();
      }
    }
  }
}class Class1{
  static{
    print();
  }
  public static void print(){
    System.out.println("s1="+s1+"\t\t"+"s2="+s2);
  }
  static String s1="String1";
  static String s2="String2";
}
final class Class2{
  static{
    print();
  }
  public static void print(){
    System.out.println("s1="+s1+"\t\t"+"s2="+s2);
  }
  static String s1=Class2.s2;
  static String s2="String2";
}final class Class3{
  static{
    print();
  }
  public static void print(){
    System.out.println("s1="+s1+"\t\t"+"s2="+s2);
  }
  static String s1=Class3.s2;
  final static String s2="String2";
}final class Class4{
  static{
    print();
  }
  public static void print(){
    System.out.println("s1="+s1+"\t\t"+"s2="+s2);
  }
  static String s1=Class4.s2;
  final static String s2=new String("String2");

你能解释结果吗?

解决方案 »

  1.   


    Sorry!我不是专家:~)
      

  2.   

    不好意思,这个代码确实不是很直观,改一下:
    public  class Test {
      public static void main(String[] args) {
      }
    }class Class1{
      static{
        print();
      }
      public static void print(){
        System.out.println("s1="+s1+"\t\t"+"s2="+s2);
      }
      static String s1="String1";
      static String s2="String2";
    }
    final class Class2{
      static{
        print();
      }
      public static void print(){
        System.out.println("s1="+s1+"\t\t"+"s2="+s2);
      }
      static String s1=Class2.s2;
      static String s2="String2";
    }final class Class3{
      static{
        print();
      }
      public static void print(){
        System.out.println("s1="+s1+"\t\t"+"s2="+s2);
      }
      static String s1=Class3.s2;
      final static String s2="String2";
    }final class Class4{
      static{
        print();
      }
      public static void print(){
        System.out.println("s1="+s1+"\t\t"+"s2="+s2);
      }
      static String s1=Class4.s2;
      final static String s2=new String("String2");

      

  3.   

    不好意思,这个代码确实不是很直观,改一下:
    本来为了方便,采用反射,没想到更不方便,如果要循环100次就显示出方便了
    当然这个题比较难,你没有必要能解释,但是至少要能看明白程序在干吗。
    欢迎大家加入群众讨论.
    public  class Test {
      public static void main(String[] args) {
            Class1.print();
            Class2.print();
            Class3.print();
            Class4.print();         
     }
    }class Class1{
      static{
        print();
      }
      public static void print(){
        System.out.println("s1="+s1+"\t\t"+"s2="+s2);
      }
      static String s1="String1";
      static String s2="String2";
    }
    final class Class2{
      static{
        print();
      }
      public static void print(){
        System.out.println("s1="+s1+"\t\t"+"s2="+s2);
      }
      static String s1=Class2.s2;
      static String s2="String2";
    }final class Class3{
      static{
        print();
      }
      public static void print(){
        System.out.println("s1="+s1+"\t\t"+"s2="+s2);
      }
      static String s1=Class3.s2;
      final static String s2="String2";
    }final class Class4{
      static{
        print();
      }
      public static void print(){
        System.out.println("s1="+s1+"\t\t"+"s2="+s2);
      }
      static String s1=Class4.s2;
      final static String s2=new String("String2");

      

  4.   

    不要误会,如果大家不相互帮助,如何进步?
    yanjiqiang(爱你一千年)
    我告诉你:如果你只是每天在CSDN上混,是没法提高的
    先看一些基础的书籍才是正道。
    推荐两本
    <<Thinking in Java>>
    <<effective java>>
    如果要电子版,我有很多
    发邮件到[email protected]
    来者必回,你只要知名书名,我尽量找
      

  5.   

    我不是JAVA高手,看楼主反射学得好,想请教一下楼主:下面这段话中的“JAVA想说明运算可以在运行中改”的关键在于什么呢??如何才能让运算可以在运行中改??
    4.6. 映射(Reflection) 下面 通过对加法运算的两种不同情况阐述映射的概念。 · 普通的32位加法,如果溢出了,怎么办?可不可以做64位加呢?既然是数,就能改,可以在运行过程中(动态)把一个32位数用一个PUSH语句入栈,再把另一个也压入栈中,这样32位加法运算转变为64位加法运算,问题解决了。同样的加、减、乘、除这四个运算,可以映射出不同的运算实现来,32位运算,64位运算是两种不同的实现,这种不同的实现就是对同一个描述的不同映射。 · 网络上的运算如何实现?同样还是加、减、乘、除运算,在网上,计算可以在本地进行,也可以在远程进行。比如说会做加法的进程在远程,这时本地进程将运算数据打包发给远程进程,远程进程计算后将结果打包送回。本地和远程,这是两种不同的实现方式,对于设计者来说,本地计算方式是用一段代码进行计算,远程计算方式是用一段代码与远程进行通信,但对于用户来说都是加法,除了时间上可能有差别外,其它完全一样,这是完全透明的网络运算。这就是映射。 
    C++中不存在真正的类,更不存在映射的概念。然而,类和映射的概念至关重要,要提到一个新的高度来认识。C++源程序编译后的目标代码是 .obj,而JAVA源程序编译后目标代码是 .class,JAVA想说明运算可以在运行中改,只有有了这个前提才能真正做到完全透明的网络运算。认识到这一点,举一反三,JAVA还能把32位加法动态提升为64位加法等等。如果把这种思想应用于软件设计,那么是不是能做到他人无法做到的事情呢? 映射(Reflection)这个概念怎么强调也不过分,它是程序设计的一个里程碑,从结构化设计到面向对象,有了多态这个概念,程序设计灵活了,现在又有了映射,程序设计更加灵活,人们走入了一个新境界。
      

  6.   

    楼主说错了。<<Thinking in Java>>,<<effective java>> 这两本书不适合初学者看。我是菜鸟,麻烦您推荐两本书。
    另外在qq群:3785634 上面有一个j2ee的项目要做。有关网上购物的,为大家练练手。都是菜鸟,希望高手加盟指导,也希望菜鸟共同加盟学习。诚征项目带头人,只是要求肯帮助别人就可以。
      

  7.   

    onefox(一品狐)说的好,代码是给人读的,体现个性的人我喜欢,个性的人如果写出个性的代码立刻从我的团队出去。
      

  8.   

    矛盾吗?
    难道我说邀请java菜鸟加入,虽然加入的不都是高手,但是只要有一定的基础
      

  9.   

    这段代码的意思是单独的代码块会优先执行,
    并且会在类成员变量赋值之前执行,但是如果成员变量加了final修饰
    则先执行这个修饰赋值。另外成员类实例化动作必须出现在引用它之前,
    否则引用不到。这些代码,很象孔乙己展示的茴字的四种写法。没什么意思,
    不过估计楼主过SCJP等应该很轻松吧。
    对于初学者而言,应该首先掌握最普通,最通用的东西,过分纠缠这些细节,估计最后自己找不着北了。
    总之,语言是一种工具,我们掌握它是拿来解决问题的。而不是为了研究它本身的。
      

  10.   

    偶也来才凑热闹
    >书籍是最好的老师
    >>没错!同意 but..
    >要是自信,高手都喜欢称自己是菜鸟
    >>某楼主就在说自己是菜鸟啊,看来他还是很有自信的嘛。。我不是菜鸟,但是是初学者 哈哈
    看见帖子里面几为真正的高手在。。就跑来请教一番咯,
    偶是软件专业的,现在在学j2se(以后才学J2ee和J2me)麻烦各位高手推荐几本书咯。
    感激万分!
      

  11.   

    这段代码的意思是单独的代码块会优先执行,
    并且会在类成员变量赋值之前执行,但是如果成员变量加了final修饰
    则先执行这个修饰赋值。另外成员类实例化动作必须出现在引用它之前,
    否则引用不到。
    以上看法不完全正确,他们是按文本顺序执行的。
    class Test1{
        public static int i=0;
        static{ i=10;}
        public static main(String[] args){System.out.println(i);}
    }
    class Test2{
        static {i=10;}
        public static int i=0;
        public static main(String[] args){System.out.println(i);}
    }
    上面的结果可以说明这个
      

  12.   

    usabcd(9号公路上的3名共军) ( ) 总之,语言是一种工具,我们掌握它是拿来解决问题的。而不是为了研究它本身的。
    --------------------------------------------------------------------------同意。
      

  13.   

    static{
       print();
      }请高手们解析一下这段代码.
      

  14.   

    static是静态初始化调用了一个静态方法而已
      

  15.   

    很赞同usabcd(9号公路上的3名共军) 说的话,楼主的这些东西只是java诸多特性中的一种,冰山的一角,java还有很多很有意思的体系结构值得我们去学习,而且其庞大程度是一般人一生的学不完的,没必要在这些不常用的(几乎每多少人会用)地方纠缠不清,真正有用的是学会搭建整个软件的结构,而语言只是搭建这些结构的工具,而且工具不止一种。