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();
}
}
问题:为什么私人功能不显示多态行为? 而我们仍然压倒最终方法? 它的调用基类功能为什么?
答案 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)。
在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
}
}