Java覆盖私有函数不显示多态行为

时间:2014-11-27 09:55:35

标签: java polymorphism private

public class Shape
{

final private void print() 
{
    System.out.println("in class Shape");
}

  public static void main(String[] args)
  {

    Shape shape=new Rectangle();
    shape.print();
    //calling shape class function 
    //giving output in class shape


  }

}

 public class Rectangle extends Shape
 {
    public void print() 
    {
    System.out.println("in class Rectangle");
    //super.print();

    }
  }

问题:为什么私人功能不显示多态行为?        而我们仍然压倒最终方法? 它的调用基类功能为什么?

6 个答案:

答案 0 :(得分:5)

私人功能从其子女身上看不到也无法召唤;因此这些是两个完全不同的功能。从子类的角度来看,没有什么可以覆盖的,因为它不知道父级甚至具有 print()函数。

答案 1 :(得分:1)

使其成为final private void print()是为了防止它覆盖子类。

由于final阻止覆盖,private使方法对子类不可见,因此无法访问

另见:

答案 2 :(得分:1)

由于私有,您实际上并未覆盖打印方法。它们完全不同。

你无法覆盖最终方法。

这是@override注释可以帮助您更好的地方。如果您尝试放置注释,那么您将在编译时自己实现该行为。

答案 3 :(得分:0)

除了来自Java Language Specification的Eriks回答:

  

C类从其直接超类继承超类的所有具体方法m(静态和实例),其中所有以下都是真的:

     
      
  • m是C的直接超类的成员。
  •   
  • m在与C。相同的包中公开,受保护或声明包访问。
  •   
  • 在C中声明的方法没有签名是m的签名的子签名(§8.4.2)。
  •   

and

  

在C类中声明或继承的实例方法mC,覆盖C类中声明的另一个方法mA,iff以下所有条件都为真:

     

[...]   以下之一是真的:

     
      
  • mA是公开的。
  •   
  • mA受到保护。
  •   

因此,您的子类不会继承私有方法,因此无法覆盖。

答案 4 :(得分:0)

  

多态性是行动或方法做出不同的能力   基于它所作用的对象的东西。换一种说法,   polymorphism允许您定义一个接口并具有多个接口   实现。这是面向对象的基本原则之一   编程。

     

方法覆盖是运行时多态性的一个示例。您   可以在子类中使用方法覆盖其超级方法   具有相同名称和签名的类。 Java虚拟机确定正确   在运行时调用的方法,而不是在编译时调用。

但是如果你认为print()是实例方法,并且在运行时为什么它不是从Rectangle print()方法调用。

原因是子类的print()不是覆盖方法,因为父类方法是final,无法覆盖。

  Shape shape=new Rectangle();
  shape.print(); // prints in the shape class

  ((Rectangle)shape).print(); //prints in the rectangle class

由于父级的类方法是私有的,所以它对于外部世界是不可见的,因为它是最终的,所以它不能被覆盖。

答案 5 :(得分:0)

在您的示例中,它显示为private final方法,因此此方法在类的旁边不可见。因此,Rectangle无法看到Shape类中定义的方法。

public class A{
  final private method1(){
  }
  final public method2(){
  }
  public method3(){
  }
}

public class B extends A{
  public method1(){
   //it is legal. but it is not a override. this method can't see the method1 defined in A
  }
  public method2(){
   //throw error. because final method can't be overriden
  }
  public method3(){
   //legal override method
  }
}