2012-08-15 160 views
20

在Java中可以重写私有方法吗? 如果不是,那么下面的代码是如何工作的?在超类中的私有方法是否可以在子类中重写?

class Base{ 
     private void func(){ 
      System.out.println("In Base Class func method !!");   
     }; 
} 

class Derived extends Base{ 
     public void func(){ // Is this a Method Overriding..????   
      System.out.println("In Derived Class func method"); 
     }  
} 

class InheritDemo{ 
     public static void main(String [] args){      
      Derived d = new Derived(); 
      d.func(); 
     } 
} 

回答

2

不,它不是。你可以标记一个覆盖只是为了确保像这样:

@Override 
public void func(){ 
    System.out.println("In Derived Class func method"); 
} 

而在这种情况下,这将是一个编译器错误。

+1

好的@ @ Override',超好用! – TheZ 2012-08-15 20:09:56

+0

感谢您的回复..但是,即使我在超类最终做出了方法,代码也能正常工作......所以我认为如果我们在子类中使用与不同修饰符相同的方法签名,它只是创建一个新方法的子类而不是覆盖上面的一个.. – AnkitChhajed 2012-08-15 20:12:23

+0

请参阅编辑。我误读了“私人”。 XD – Doorknob 2012-08-15 20:12:53

17

不,不能重写私有方法,因为它不可见于任何其他类。您已经为您的子类声明了一个与超类方法无关的新方法。看待它的一种方法是问自己在Derived类中编写super.func()是否合法。重写方法不可能被禁止访问它重写的方法,但在这里就是这种情况。

+1

是的..如果它被覆盖,那么如果我创建超类的引用并将基类对象分配给它。吨也必须工作,但它不是 – AnkitChhajed 2012-08-15 20:14:37

1

你不是压倒一切的。你不能重写私人成员,你只是在Derived中定义一个新的方法。自从声明为私有后,派生自己没有知识库的实现func()。在Derived中定义func()时,您将不会收到编译器错误,但这是因为Derived不知道Base的实现为func()。要清楚:说你重写Base的实现func()是不正确的。

+0

哦哎呀我误读'私人'XD – Doorknob 2012-08-15 20:11:55

1

没有,因为如果你做了类似Base b = new Derived();的事情,你仍然无法调用b.func()。你在做什么被称为“隐藏”。

+0

嗯..非常感谢 – AnkitChhajed 2012-08-15 20:16:08

37

不,你不是压倒性的。您可以通过尝试使用@Override进行标记或尝试拨打super.func();来进行检查。两者都行不通;他们抛出编译器错误。

此外,检查了这一点:

class Base { 
     private void func(){ 
      System.out.println("In base func method");   
     }; 
     public void func2() { 
      System.out.println("func2"); 
      func(); 
     } 
} 

class Derived extends Base { 
     public void func(){ // Is this an overriding method? 
      System.out.println("In Derived Class func method"); 
     } 
} 

class InheritDemo { 
     public static void main(String [] args) { 
      Derived D = new Derived(); 
      D.func2(); 
     } 
} 

它会打印:

func2 
In base func method 

当您在Base改变func()公众,然后这将是一个覆盖,并输出将更改为:

func2 
In Derived Class func method 
+1

@Polygnome:示例+1展示它不是一个覆盖,和'@ Override'测试。 – 2012-08-15 23:06:12

+2

+1表示在这种情况下动态分派如何工作(或不工作:D)。 – 2013-07-10 10:10:55

+1

很好的答案。 – 2017-05-05 11:51:01

0

由于该方法是私有的,因此其他类不可见。因此,派生类不会继承此方法。 所以这是不是覆盖的情况下

0

方法隐藏将发生在这里,而不是重写。就像静态情况下会发生什么一样。

0

其实,你是不是overriding.Before Java5的

覆盖方法的返回类型必须与父类的方法相匹配。

但是Java 5引入了一种叫做covariant return type的新工具。你可以重写一个具有相同签名的方法,但返回返回对象的一个​​子类。换句话说,子类中的方法可以返回一个对象,该对象的类型是该超类中具有相同签名的方法返回的类型的子类。 你可以按照这个线程:Can overridden methods differ in return type?

-1

你不能重写的东西是不可见的或不存在的子类。

相关问题