class Base{
    private final void f(){
        System.out.println("Base.f()");
    }
}
class Derived extends Base{
    public final void f(){
        System.out.println("Derived.f()");
    }
}
public class Main {
    
        public static void main(String[] args) {
        Derived op1 = new Derived();
        Base op2=op1;
        op1.f();
        op2.f();// 这一行为什么会出错?
    }
    
}    根据我的理解,所谓动态性,就是在运行时正确识别对象的类型.op2虽然是一个基类引用,但它指向的是子类的实例,而子类是有一个public 的方法f()的 ,为什么op1能调用而op2不能调用,op1 和 op2 指向的是同一个对象嘛??why?

解决方案 »

  1.   

    父类中的private方法不能被子类覆盖,父类的f()是protected或者public的话就没有问题乐
    http://book.csdn.net/bookfiles/49/100491542.shtml
      

  2.   

    Base op2 = op1;与直接 Base op2 = new  Derived();同访问一个对象时,它首先会找它私有的东西(private),其次才是它有的东西(多态)。
      

  3.   

    另外final方法也是不能被重写的
      

  4.   

    我的感觉是这个题目好象不是多态的把。多态一般都是向上转型的,而这个是向下转型的。
    本人也正在学Java中……
      

  5.   

    TO:楼主
    你写的这个编译时就会报错,你的理解是对的,但编译器是严格而且是敏感的,在JAVA虚拟机中对你源码的识别是Base的方法,而Base的方法是private所以编译会错。
    本人新建JAVA群欢迎交流:群号8595489
      

  6.   

    晚上睡不着,路过看到
    我觉得的有2点
    1.编译器表面上报错说是父类的void f()是私有的,不能在类本身外部调用,
    但是其实op2.f()调用的不是父类的f()方法,而是子类的f()方法,这就是父类对象调用子类的方法,如果子类对象调用父类的方法是理所当然的,这就是继承。
    父类与子类的关系好比一个男人和人的关系,男人(子类)肯定是人(父类),子类对象自动转换为父类对象,但是男人做的还是男人自己的事(子类自己的方法)。
    class Base{public void f(){
            System.out.println("Base.f()");
            
        }
    }
    class Derived extends Base{    public void f(){
            System.out.println("Derived.f()");
        }
    }
    public class Main {
        
            public static void main(String[] args) {
            Derived op1 = new Derived();
           
            Base op2=op1;
            op1.f();
            op2.f();
        }
        
    }输出的是:
    Derived.f()
    Derived.f()2.在类里用final定义的方法是不能被重载也不能被覆盖的。但是有一点不明白
    为什么这里可以覆盖(假如去掉op2.f())编译能够通过。但是如果把父类的private改成public就报错说不能被覆盖,
    是不是子类权限比父类大了就可以了呢?
    小弟初学java忘高手们帮帮忙
      

  7.   

    支持 tallen2005(天乐) 说的
      

  8.   

    op2.f() ;我认为应该调用的是子类的,可实际上它调用的是父类的。根据多太性,虚拟机应该在运行时能够识别op2指向的是子类的 啊 ?
        还是有点迷惑,请大家帮忙指点。
      

  9.   

    我的理解,这里Derived类中的 f()方法跟基类的f()方法没有任何关系,不知对不对?
      

  10.   

    关键字final声明的方法不能被承载
      

  11.   

    不好意思啊,我在上面的解释是不恰当的,现在更正一下:
    多态中,在向上转型后,只能调用base class中被derived class overriding的方法,不能调用derived class extention中的方法。正解,嘿嘿,我要飞(分)我要飞(分)我要飞(分)
      

  12.   

    具体解释看这里http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html
      

  13.   

    private方法对子类是不可见的,也就是说,子类里的f()就是子类的f(),和父类的f()是一点关系也没有的,父类是感觉不到这个子类里的f()的存在的.
    另外,如果把父类里的f()改做public的话也不对,因为被声明为finalr的方法是不能被覆盖的.
    请大家指教:)
      

  14.   

    涉及多态问题:向上转型后,调用某个函数,若 derived class overriding 了该函数,则会调用该 derived class 中的函数,否则会调用 base class 中的函数
      

  15.   

    涉及多态问题:向上转型后,调用某个函数,若 derived class overriding 了该函数,则会调用该 derived class 中的函数,否则会调用 base class 中的函数很显然,这里既然没有重写,所以只能调用父类的方法,但是,父类中的方法又是private 编译器唯一能说的就是错误 http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html
      

  16.   

    补充几点覆盖的注意事项:
    子类方法的访问权限不能低于父类方法(如父类为public,子类就只能为public)
    父类方法的访问权限为private,子类不能覆盖
    父类中的方法如果有final修饰符,子类不能覆盖
    子类方法不能抛出比父类方法更多的异常(可以抛出和父类方法一样的异常或抛出父类方法异常类的子类)
    父类的非静态方法不能被子类覆盖为静态方法