事实上就相当于
M m = new MM();
System.out.println(m.getClass());
输出当然为MM的了。

解决方案 »

  1.   

    这并不奇怪:以为getClass()是在Object里实现的final方法;
    他返回的是正在运行类的Class!
    顺便说一句: final 关键字的意思是:
    某个类的方法被声明为final后,就是说以后任何继承与该类的类,不能重写该方法.
      

  2.   

    噢!这里说的正在运行类,就是主类就是public static void main(String[] args)所在的类!
      

  3.   

    哈哈哈 下面这个程序输出M了class M{}
    class MM extends M{
      public Class getSuperClass(){
        return super().getClass();
      }
      public static void main(String[] args){
        System.out.println((new MM()).getSuperClass())
      }
    }
      

  4.   

    上面的程序不能编译通过的  super()必须在子构造器第一行调用
      

  5.   

    搞明白super的意思就行了,和super()不同
      

  6.   

    game0ver12345(sfsfdsfdsdfsf)看清楚这里是几行代码。return super().getClass();晕。
      

  7.   

    回复人: javafaq2004(农村干部瞎忙活) ( ) 信誉:95  2004-04-20 21:34:00  得分:0 
     
     
      game0ver12345(sfsfdsfdsdfsf)看清楚这里是几行代码。return super().getClass();晕。
     
     
    ==============================我看清楚了,
    M有一行代码 
    MM有8行代码不懂你什么意思 ?
      

  8.   

    我已经搞懂了,我刚才还改了程序,刚才的回复就是我改了的新程序,现在输出正确了。假如MM隐藏参数this叫做mm , M隐藏参数this叫做m  好难表达,只好说super.getClass() 的隐藏this参数是mm
      

  9.   

    假如System.out.println((new MM()).getSuperClass()) 中的new MM()产生一个对象mm 
    ((new MM()).getSuperClass()) 相当于 mm.getSuperClass() mm.getSuperClass() 表示 mm要调用M类的getClass()方法。getClass的意思就要把mm的类显示出来.mm的实际类是MM所以输出 是MM 
    好难表达, 不同意请说一下你的意见。
      

  10.   

    getClass的意思就要把mm的类显示出来.????这个是你从哪里得到的?
      

  11.   

    To  game0ver12345(sfsfdsfdsdfsf)
    class M{}
    class MM extends M{
      public Class getSuperClass(){
        return super().getClass();
      }
      public static void main(String[] args){
        System.out.println((new MM()).getSuperClass());
      }
    }上面这个代码肯定是不能通过的,因为super()的调用必须在构造器的第一行。这个问题主要是我们没有正确认识super与this的不同 他们的相同之处是都可以
    指构造器,但是this可以作为隐含的引用。但是super没有这个功能,所以
    return super.getClass()如果是理解为调用超类的引用的getClass()的方法那么就会认为
    输出应该是M,但是super并没有这个功能,他不是指超类的隐含引用,而是调用超类的方法
    其实 这个是相当去调用了return this.getClass()所以返回的应该是MM
      

  12.   

    game0ver12345(sfsfdsfdsdfsf)增加你的装备吧!
     mingjava(学习) 呵呵class M{
    public final Class mySub() throws ClassNotFoundException{
    return Class.forName("M");
    }
    }public class MM extends M{
    public static void main(String[] args) throws ClassNotFoundException{
    System.out.println((new MM()).mySub());
    }
    }
      

  13.   

    class M{
    public final Class mySub() throws ClassNotFoundException{
    return Class.forName("M");
    }
    }public class MM extends M{
    public Class test() throws ClassNotFoundException{
    return super.mySub();
    }
    public static void main(String[] args) throws ClassNotFoundException{
    System.out.println((new MM()).test());
    }
    }
      

  14.   

    class M{
    public Class mySub() throws ClassNotFoundException{
    return Class.forName("M");
    }
    }public class MM extends M{
    public Class mySub() throws ClassNotFoundException{
    return Class.forName("MM");
    }
    public Class test() throws ClassNotFoundException{
    return super.mySub();
    }
    public static void main(String[] args) throws ClassNotFoundException{
    System.out.println((new MM()).test());
    }
    }
        /**
         * Returns the runtime class of an object. That <tt>Class</tt> 
         * object is the object that is locked by <tt>static synchronized</tt> 
         * methods of the represented class.
         *
         * @return  the object of type <code>Class</code> that represents the
         *          runtime class of the object.
         */
        public final native Class getClass();
      

  15.   

    回复人: mingjava(学习) ( ) 信誉:93  2004-04-20 23:20:00  得分:0 
     
     
      getClass的意思就要把mm的类显示出来.????这个是你从哪里得到的?
      
     
    ==============================================从JDK getClass()的意思从Object继承的。如果 A继承 B , B继承Object ,如果a.getClass() 是A , 那么无论a是调用Object.getClass() 还是调用 B.getClass() 结果都是一样的,就是A 。   因为getClass()的意思就是a的运行期的类 , 就是说a一开始是什么就是什么。不受造型的影响。
      

  16.   

    回复人: mingjava(学习) ( ) 信誉:93  2004-04-20 23:54:00  得分:0 
     
     
      To  game0ver12345(sfsfdsfdsdfsf)
    class M{}
    class MM extends M{
      public Class getSuperClass(){
        return super().getClass();
      }
      public static void main(String[] args){
        System.out.println((new MM()).getSuperClass());
      }
    }上面这个代码肯定是不能通过的,因为super()的调用必须在构造器的第一行。这个问题主要是我们没有正确认识super与this的不同 他们的相同之处是都可以
    指构造器,但是this可以作为隐含的引用。但是super没有这个功能,所以
    return super.getClass()如果是理解为调用超类的引用的getClass()的方法那么就会认为
    输出应该是M,但是super并没有这个功能,他不是指超类的隐含引用,而是调用超类的方法
    其实 这个是相当去调用了return this.getClass()所以返回的应该是MM=======================================================
    真对不起,我的代码没测试,想当然了。但我想表现 的意思是对的。
    super()是表示父类的构造器。
    super是表示父类的this对象。return super.getClass() 和return getClass() 是相等的 , 因为无论哪个getClass , 它的结果都是当前运行期的类。 super.getClass() 和getClass 前面隐含了this
      

  17.   

    下面的代码表现无论getClass是父类的还是子类的,结果都是一样, 因为无论哪个getClass返回的都是当前运行期的类 
    class MM extends M{
      
      public static void main(String[] args){
        MM mm = new MM() ;
        System.out.println(mm.getClass()) ;
        System.out.println(((M)mm).getClass()) ;
        System.out.println(((Object)mm).getClass()) ;
      }
    }结果是class MM
    class MM
    class MM
      

  18.   

    getClass()并不是static的方法  你调用Object.getClass()  B.getClass()能得到什么呢?
    必须要有class的引用才可以调用。  搂主的问题出在搂主认为super是指向超类的一个引用,所以调用super.getClass()应该返回M  但是super并不是这样的 super.someMethod()
    这个是调用超类的someMethod方法。 所以return super.getClass()是相当于MM的隐藏引用
    this去调用了getClass()方法  这样返回MM是正确的。  事实上如果是通过一个ClassLoader装载的话,调用super.getClass()是没有什么意义的,不如直接调用this.getClass()
    这样更清楚  免得误导别人 不知道我说的是不是清楚   大家一起学习
      

  19.   

    super是表示父类的this对象。这个是错误的  super没有这个功能 如果有的话  那么上面返回的就是M了 不是MM
      

  20.   

    回复人: mingjava(学习) ( ) 信誉:93  2004-04-21 09:34:00  得分:0 
     
     
      getClass()并不是static的方法  你调用Object.getClass()  B.getClass()能得到什么呢?
    必须要有class的引用才可以调用。  搂主的问题出在搂主认为super是指向超类的一个引用,所以调用super.getClass()应该返回M  但是super并不是这样的 super.someMethod()
    这个是调用超类的someMethod方法。 所以return super.getClass()是相当于MM的隐藏引用
    this去调用了getClass()方法  这样返回MM是正确的。  事实上如果是通过一个ClassLoader装载的话,调用super.getClass()是没有什么意义的,不如直接调用this.getClass()
    这样更清楚  免得误导别人 不知道我说的是不是清楚   大家一起学习
     
     =======================================================super.getClass() 不是说父类的对象(M)去调用getClass() 而是当前的对象(MM)去调用父类的getClass() 
      

  21.   

    super.getClass() 不是说父类的对象(M)去调用getClass() 而是当前的对象(MM)去调用父类的getClass() 难道我说的不是这个意思吗 ???
    你对super的理解有错误  她并不时父类的this引用
      

  22.   

    回复人: mingjava(学习) ( ) 信誉:93  2004-04-21 09:38:00  得分:0 
     
     
      super是表示父类的this对象。这个是错误的  super没有这个功能 如果有的话  那么上面返回的就是M了 不是MM
     
     
    ==========================================super是表示父类的this对象。是表示调用父类this对象的getClass()而不是getClass()的隐含参数是父类的this不知怎么说. super.getClass() = this.super.getClass() ,其实隐含的参数this.这里这个this是MM的对象 ,可以放()里则super.getClass() = this.super.getClass() =super.getClass(this) =super.getClass(mm)super.getClass() 是表示调用父类的getClass() 如果说super是表示父类的this对象,则是m.getClass(mm) 实际是说调用M的getClass() 但this参数是MM
    (这里请忽略不合法的格式) 。 
      

  23.   

    回复人: game0ver12345(sfsfdsfdsdfsf) ( ) 信誉:100  2004-04-21 09:42:00  得分:0 
     
     
      回复人: mingjava(学习) ( ) 信誉:93  2004-04-21 09:34:00  得分:0 
     
     
      getClass()并不是static的方法  你调用Object.getClass()  B.getClass()能得到什么呢?
    必须要有class的引用才可以调用。  搂主的问题出在搂主认为super是指向超类的一个引用,所以调用super.getClass()应该返回M  但是super并不是这样的 super.someMethod()
    这个是调用超类的someMethod方法。 所以return super.getClass()是相当于MM的隐藏引用
    this去调用了getClass()方法  这样返回MM是正确的。  事实上如果是通过一个ClassLoader装载的话,调用super.getClass()是没有什么意义的,不如直接调用this.getClass()
    这样更清楚  免得误导别人 不知道我说的是不是清楚   大家一起学习
     
     =======================================================super.getClass() 不是说父类的对象(M)去调用getClass() 而是当前的对象(MM)去调用父类的getClass()  
     
    =========================================
    我基本同意你的话,但认为 有个前提条件是 恰恰好getClass() =super.getClass() = Object.getClass() 的如果是别的方法 super.getXXX() 不一定等于 getXXX() 这个问题就可能不是这样了其它你的部分我是同意的,只是我认为你可能忽略了super.getClass() = getClass() 这个条件。
      

  24.   

    难道你还认为super是超类的this引用???如果你还这么想的话  那么你的推理都是建立在错误的基础上的
      

  25.   

    Test this:package uitest.test;
    class M{}
    class MM extends M{
      public Class getSuperClass(){
        return super.getClass();
      }
      public static void main(String[] args){
        System.out.println((new MM()).getSuperClass().getSuperclass());
      }
    }output: class uitest.test.M
      

  26.   

    从我以下这个程序可看出getClass() 是一个有点特别的方法 ,  getClas() = super.getClass()
      而普通的方法例如 下面的 getXXX()!= super.getClass() 返回的结果和楼主程序的结果不是一样的.所以楼主的程序隐含一个条件。 getClas() = super.getClass()
    class M
    {
       public String getXXX()
       {
            return M ;
       }
    }
    class MM extends M{
       public String getXXX()
       {
           return MM ;
       }
      public Class getSuperClass(){
        return super.getXXX();
      }
      public static void main(String[] args){
        System.out.println((new MM()).getSuperClass()) ;
      }
    }
      

  27.   

    回复人: mingjava(学习) ( ) 信誉:93  2004-04-21 10:09:00  得分:0 
     
     
      难道你还认为super是超类的this引用???如果你还这么想的话  那么你的推理都是建立在错误的基础上的=======================================================我不同意你的说法。return super.getClass() 就是m.getClass() 就是 mm.m.getClass() 就是m.getClass(mm) 调用的方法是父类M的方法,但隐含this参数还是mm  则结果可表示 为 super.getClass = m.getClass(mm)
      

  28.   

    回复人: game0ver12345(sfsfdsfdsdfsf) ( ) 信誉:100  2004-04-21 10:15:00  得分:0 
     
     
      回复人: mingjava(学习) ( ) 信誉:93  2004-04-21 10:09:00  得分:0 
     
     
      难道你还认为super是超类的this引用???如果你还这么想的话  那么你的推理都是建立在错误的基础上的=======================================================我不同意你的说法。return super.getClass() 就是m.getClass() 就是 mm.m.getClass() 就是m.getClass(mm) 调用的方法是父类M的方法,但隐含this参数还是mm  则结果可表示 为 super.getClass = m.getClass(mm)(m就是表示super , mm 就是super.getClass()前面隐含的this 则super.getClass其实是this.super.getClass())
     
     
    我说的super就是父类的this this 就是m 但这个 你类的this仅仅调用父类的方法m.getClass() 而作为隐含 参数传入 m.getClass()还是mm这个this  
      

  29.   

    my god  如果super是超类的this引用的话  那么返回的绝对是M但是super.getClass()是表示调用父类的方法  在这个问题里面是MM的隐含引用this来调用超类的getClass()的你可以在程序里面这样写
    public Class getSuperClass()
    {
       return new M().getClass();
    }如果你说的super是超类的this引用的话  那么这个和super.getClass()的返回结果肯定一样
    但是这个肯定返回M对这个问题我不想多说了  super并没有代表超类的一个引用的能力  只是代表调用父类的方法而已
      

  30.   

    super并没有代表超类的一个引用的能力  只是代表调用父类的方法而已 ==============================
    你的说法是对了,我其实就是想表达这句话的意思 ,说来说去都说不出来,真是脸红
    基本上我是同意你的,只是我认为你可能忽略了super.getClass() = getClass() 这个条件。
      

  31.   

    看了各位的高见
    我本人比较同意game0ver12345(sfsfdsfdsdfsf) 的观点
      

  32.   

    game0ver12345(sfsfdsfdsdfsf) 我觉得你一些概念还没有弄清楚呢你的推理 return super.getCLass()就是m.getClass()是不正确的  如果这个成立的话
    那么返回就是M了  而不是MM另外你在super.getCLass()和getCLass()之间划个=没有任何意义  并不是我忽略不忽略的问题
      

  33.   

    mingjava(学习) 怎么老是在讨论低级话题呢?这个问题的关键体现在getClass(),
    仔细看看 sparkwu(吳府明) 的回答吧!
      

  34.   

    我总结了, 1 super并没有代表超类的一个引用的能力  只是代表调用父类的方法而已 。super.getClass()仅仅表示调用父类的 getClass()方法 ,(其实本来我也同意mingjava(学习)这个意见 ,只是因为我表达失误的缘故) 。return super.getClass() 这句话的意思:返回 MM的对象调用父类M的方法getClass()的结果 。 2 getClass()是Object的方法,M和MM都是继承Object这个方法的。 Object类的方法getClass()
    实际返回的结果就是运行期对象的类,在这里getClass()是特殊的,因为mm.getClass()=((M)mm).getClass() = ((Object)mm).getClass() 。别的方法一般没有这样的特性,例如我在上面的例子getXXX() ,mm.getXXX() = MM , m.getXXX = M ,mm.getXXX()!=((M)mm).getXXX() 。
      

  35.   

    什么话题是低级的呢?sparkwu的那个程序我当然知道了  但是那并不是这个问题的实质 
    之所以大家觉得奇怪是大家觉得super和this一样, 可以代表超类的引用
    但是super并不是这样的  关键根本是在super
      

  36.   

    认识上面两点就可作出正确的判断。     第一点判断mingjava(学习)已经明确指出,之前我也明白这点 ,只是我表达不出来。
         第二点我认为mingjava(学习)忽略了,如果楼主的程序其中getClass()使用我定义的getXXX()方法代替,答案一定是MM。在这里getClass()是特殊的,因为无论对象调用Object.getClass(),或者调用MM.getClass() ,或者M.getClass() ,返回的结果是相同的。而别的普通方法不一定有这样的特性。
      

  37.   

    this(当前类).getClass() = this(隐含参数).this(当前类).getClass() = this(当前类).getClass(this(隐含参数)) 
    表示调用当前类的方法getClass() 隐含参数是当前类对象
    super(父类).getClass() = this(隐含参数).super(父类).getClass() = super(父类).getClass(this(隐含参数))
    表示调用父类方法getClass() 隐含参数是当前类对象