哈哈哈 下面这个程序输出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()) } }
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
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()); } }
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()); } }
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();
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
下面的代码表现无论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
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
从我以下这个程序可看出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()) ; } }
我说的super就是父类的this this 就是m 但这个 你类的this仅仅调用父类的方法m.getClass() 而作为隐含 参数传入 m.getClass()还是mm这个this
my god 如果super是超类的this引用的话 那么返回的绝对是M但是super.getClass()是表示调用父类的方法 在这个问题里面是MM的隐含引用this来调用超类的getClass()的你可以在程序里面这样写 public Class getSuperClass() { return new M().getClass(); }如果你说的super是超类的this引用的话 那么这个和super.getClass()的返回结果肯定一样 但是这个肯定返回M对这个问题我不想多说了 super并没有代表超类的一个引用的能力 只是代表调用父类的方法而已
他返回的是正在运行类的Class!
顺便说一句: final 关键字的意思是:
某个类的方法被声明为final后,就是说以后任何继承与该类的类,不能重写该方法.
class MM extends M{
public Class getSuperClass(){
return super().getClass();
}
public static void main(String[] args){
System.out.println((new MM()).getSuperClass())
}
}
game0ver12345(sfsfdsfdsdfsf)看清楚这里是几行代码。return super().getClass();晕。
==============================我看清楚了,
M有一行代码
MM有8行代码不懂你什么意思 ?
((new MM()).getSuperClass()) 相当于 mm.getSuperClass() mm.getSuperClass() 表示 mm要调用M类的getClass()方法。getClass的意思就要把mm的类显示出来.mm的实际类是MM所以输出 是MM
好难表达, 不同意请说一下你的意见。
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
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());
}
}
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());
}
}
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();
getClass的意思就要把mm的类显示出来.????这个是你从哪里得到的?
==============================================从JDK getClass()的意思从Object继承的。如果 A继承 B , B继承Object ,如果a.getClass() 是A , 那么无论a是调用Object.getClass() 还是调用 B.getClass() 结果都是一样的,就是A 。 因为getClass()的意思就是a的运行期的类 , 就是说a一开始是什么就是什么。不受造型的影响。
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
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
必须要有class的引用才可以调用。 搂主的问题出在搂主认为super是指向超类的一个引用,所以调用super.getClass()应该返回M 但是super并不是这样的 super.someMethod()
这个是调用超类的someMethod方法。 所以return super.getClass()是相当于MM的隐藏引用
this去调用了getClass()方法 这样返回MM是正确的。 事实上如果是通过一个ClassLoader装载的话,调用super.getClass()是没有什么意义的,不如直接调用this.getClass()
这样更清楚 免得误导别人 不知道我说的是不是清楚 大家一起学习
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()
你对super的理解有错误 她并不时父类的this引用
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
(这里请忽略不合法的格式) 。
回复人: 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() 这个条件。
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
而普通的方法例如 下面的 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()) ;
}
}
难道你还认为super是超类的this引用???如果你还这么想的话 那么你的推理都是建立在错误的基础上的=======================================================我不同意你的说法。return super.getClass() 就是m.getClass() 就是 mm.m.getClass() 就是m.getClass(mm) 调用的方法是父类M的方法,但隐含this参数还是mm 则结果可表示 为 super.getClass = m.getClass(mm)
回复人: 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
public Class getSuperClass()
{
return new M().getClass();
}如果你说的super是超类的this引用的话 那么这个和super.getClass()的返回结果肯定一样
但是这个肯定返回M对这个问题我不想多说了 super并没有代表超类的一个引用的能力 只是代表调用父类的方法而已
你的说法是对了,我其实就是想表达这句话的意思 ,说来说去都说不出来,真是脸红
基本上我是同意你的,只是我认为你可能忽略了super.getClass() = getClass() 这个条件。
我本人比较同意game0ver12345(sfsfdsfdsdfsf) 的观点
那么返回就是M了 而不是MM另外你在super.getCLass()和getCLass()之间划个=没有任何意义 并不是我忽略不忽略的问题
仔细看看 sparkwu(吳府明) 的回答吧!
实际返回的结果就是运行期对象的类,在这里getClass()是特殊的,因为mm.getClass()=((M)mm).getClass() = ((Object)mm).getClass() 。别的方法一般没有这样的特性,例如我在上面的例子getXXX() ,mm.getXXX() = MM , m.getXXX = M ,mm.getXXX()!=((M)mm).getXXX() 。
之所以大家觉得奇怪是大家觉得super和this一样, 可以代表超类的引用
但是super并不是这样的 关键根本是在super
第二点我认为mingjava(学习)忽略了,如果楼主的程序其中getClass()使用我定义的getXXX()方法代替,答案一定是MM。在这里getClass()是特殊的,因为无论对象调用Object.getClass(),或者调用MM.getClass() ,或者M.getClass() ,返回的结果是相同的。而别的普通方法不一定有这样的特性。
表示调用当前类的方法getClass() 隐含参数是当前类对象
super(父类).getClass() = this(隐含参数).super(父类).getClass() = super(父类).getClass(this(隐含参数))
表示调用父类方法getClass() 隐含参数是当前类对象