看到了这样一个问题,http://www.oschina.net/question/555043_242782。 java
回答一下,写下来。 this
问题: spa
package t4; class Father{ private void print() { System.out.println("Father") ; } public void fun() { System.out.println(this); this.print() ; // 调用print()方法 } }; class Child extends Father{ // 定义继承关系 public void print(){ // 覆写父类中的方法 System.out.println("Child") ; } }; public class Test4 { public static void main(String args[]) { Child s = new Child() ; s.fun() ; } };
以上就是这个问题自己了。 .net
回答: code
其实反编译一下 看一下虚拟机的"汇编代码"就很清楚了。。。
你的Father是这样的。 继承
class Father{ private void print()//这是私有方法 { System.out.println("Father") ; } public void fun() { System.out.println(this); this.print() ; // 调用print()方法 } };
public class Father { public Father(); Code: 0: aload_0 1: invokespecial #1 ()V 4: return public void fun(); Code: 0: getstatic #2 io/PrintStream; 3: aload_0 4: invokevirtual #5 n:(Ljava/lang/Object;)V 7: aload_0 8: invokespecial #6 //注意这里是invokespecial 11: return }
public class Father { public void print()//注意这里是公共方法 { System.out.println("Father") ; } public void fun() { System.out.println(this); this.print() ; // 调用print()方法 } }
public void print(); Code: 0: getstatic #2 io/PrintStream; 3: ldc #3 5: invokevirtual #4 n:(Ljava/lang/String;)V 8: return public void fun(); Code: 0: getstatic #2 io/PrintStream; 3: aload_0 4: invokevirtual #5 n:(Ljava/lang/Object;)V 7: aload_0 8: invokevirtual #6 //这里是invokevirtual 11: return }结论: 当你Father里的print是private方法时,fun里面使用invokespecial的。 当你Father里的print是public方法时,fun里面是用invokevirtual的。 invokespecial是调用私有方法(因此打印出来的是"Father"),invokevitual是调用实例方法(因此打印出来是"Child",这里的实例,正如打印出来的this是child)