代码之家  ›  专栏  ›  技术社区  ›  Rahul Garg

混淆“重写私有方法”

  •  13
  • Rahul Garg  · 技术社区  · 17 年前

    关于这个密码我有两个问题

    public class Override {
        private void f() {
            System.out.println("private f()");
        }
        public static void main(String[] args) {
            Override po = new Derived();
            po.f();
        }
    }
    
    class Derived extends Override {
        public void f() {
            System.out.println("public f()");
        }
    } 
    
    /*
    * Output: private f()
    */// :~
    

    1)在超控采购单的参照上,功能F是如何可见的;

    2)为什么输出“private f()”

    3 回复  |  直到 14 年前
        1
  •  24
  •   Vinay Sajip    17 年前
    1. 这个 main 方法在类内 Override 当然,它可以看到班上的私人成员 重写 .

    2. 你是 不 产生一个覆写函数 f 课堂上 Derived 没有多态性。变量的类型 po 是 重写 ,所以需要方法 F 从班上 重写 .

    注意这个方法 F 课堂上 重写 在课堂上根本看不见 衍生的 . 方法 F 课堂上 衍生的 是另一种方法,与该方法无关 F 在超类中。

        2
  •  2
  •   Akash Kava    17 年前
    Override po = new Derived();
    po.f();
    

    您正在访问重写自己的方法,即使该对象是派生的,因为根据作用域规则,类的私有成员被认为是第一个的,并且当它在重写作用域中写入时,它引用的是私有的f,并且由于它的私有的f在派生类中根本不被重写,因此它们将仅在方法签名相同时进行重写。

    Derived po = new Derived();
    po.f(); 
    

    thsi是正确的代码,它将调用派生的f

        3
  •  0
  •   thkala jaxb    14 年前

    方法的重写有三个条件。子类必须与其父类具有相同的名称和参数以及返回值。但如果参数和返回值都不同,则不存在重写!即使这两种方法不同!好啊!这样地:

    public class Parent {
              public  int addV(int a,int b){
            int s;
            s = a + b;
            return s;
        }
    }
    
    class Child extends Parent{
        public  void  addV(){
           //do...something
        }
    }
    

    Eclipse不会说错误!因为子类中的addv方法与父类中的addv方法不同。作为您的实例!

    推荐文章