看到了这样一个问题((JAVA)关于this的一个细节问题)

看到了这样一个问题,http://www.oschina.net/question/555043_242782java

回答一下,写下来。 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() ;
        }
    };



Father中的this是个什么鬼?为何第10行打印出来是Child,第11行调用的print方法倒是Father中的。

以上就是这个问题自己了。 .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
}





而后我把Father改一下:(print方法改为public)
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)
相关文章
相关标签/搜索