public class Drawing{
private  void f(){
System.out.println("private f()");
}
public static void main(String[] args){
  Drawing t = new Art();
  t.f();
}
} class Art extends Drawing{
public  void f(){
System.out.println("public f()");
}
问题:为什么运行后输出的结果是 private f()???

解决方案 »

  1.   

    Drawing t = new Art();
    就是这句的内存分配情况?
      

  2.   

    我的猜想是:private方法在继承的时候不会被继承,可以认为是final的
                因此,它在调用时是前绑定,即已经将它的对象类型隐藏
                的转化为基类(Drawing) 了。
      

  3.   

    编译时t.f()是认为父类对象调用父类方法运行时t.f()是子类调用子类方法,因为事实上是一个子类句柄但一定要注意编译时,是父类对象
      

  4.   

    kevinliuu(@。@) ( ) 信誉:107 编译时t.f()是认为父类对象调用父类方法运行时t.f()是子类调用子类方法,因为事实上是一个子类句柄但一定要注意编译时,是父类对象运行后输出的结果是 private f(),这个不就是运行时的输出么??
      

  5.   

    这个问题很简单,不过很迷惑人。
    基础问题啊。private是私有,除了自己谁都不可以访问,即使是自己的子子孙孙。
    只有protected以上的访问级别才可以继承。你这里,Drawing的f()方法和Art的f()方法根本就不是override的关系,完全是两个类各自独有的方法,一个是私有,一个是公有。
    所以,下面这两句代码。
    Drawing t = new Art();
    t.f();
    最后这句,实际调用的是Drawing.f()。另一个角度说,首先,你把t的类型定义为Drawing,那么就只能调用Drawing类的方法,而不可能调用出来Art独有的方法。比如你在Art里面再写一个方法public f1(),用t也是绝对调用不出来的,即使t实际上是Art的实例。上面既然说了Art.f()与Drawing.f()没有override的关系,而是各自独立的方法,那么使用Drawing类型的变量(引用)也就不可能调用Art里面的任何独立方法,包括f(),所以这里调用的只可能是Drawing.f()。你把Drawing.f()改作protected,结果就会输出public f()了。
      

  6.   

    lz, 你的猜想中前半部分没什么大问题。但是那句把类型隐藏的转化为Drawing是错误的。他的实际内存分配还是用Art的定义来分配的。不过你这里例子里面都没有自己的成员变量,也就没有什么太多的内存分配可说了,函数的话,各自是各自的,也没什么复杂的。只不过你起了两个相同的函数名,容易搞晕罢了。研究问题这么写程序尚可,要是在实际编程中,最好写得可读性更好些,最好不要把并非override关系的方法名字写成一样的。
      

  7.   


    顶,听了King_Play(程序猎人) 一席话,顿悟
      

  8.   

    这就叫动态绑定,private ,static,final都是静态绑定
      

  9.   

    不报错。
    因为虽然是private,但是main函数也是在Drawing里面,也就是在类中,所以也可以访问。