为什么最终类不能被继承但是最终方法可以继承?

时间:2016-02-17 13:42:27

标签: java class inheritance final

我对" final"的使用感到很困惑。类和方法之间的关键字 即为什么最终方法只支持继承而不支持最终类

final class A{
    void print(){System.out.println("hello world");}
}

class Final extends A{
    public static void main(String[] args){
        System.out.println("hello world");
    }
}

错误:

  

无法从Final A继承       class Final extennds A {   最终方法是......

class Bike{
    final void run(){System.out.println("run");}
}
class Honda extends Bike{
    public static void main(String[] args){
        Honda h=new Honda();
        h.run();
    }
}

2 个答案:

答案 0 :(得分:14)

  

为什么不能继承最终类,但可以继承最终方法?

为什么呢?因为final 对于类和方法来说意味着不同的事情

为什么它意味着不同的东西?因为这就是Java语言设计者选择设计语言的方式!

Java中final关键字有三个不同的含义。

  • 无法扩展final课程。

  • 无法覆盖final方法。

  • 初始化后,final变量无法分配。

为什么他们决定使用final来表示不同背景下的不同内容?可能是因为他们不需要保留2或3个不同的关键字。 (事后看来,这可能不是最好的决定。但这是有争议的......辩论它可能是浪费时间。)

值得注意的是,其他关键字在Java中具有多重含义;例如staticdefault(在Java 8中)。

答案 1 :(得分:-1)

                public class ParentDemoClass {

                public final void sayHello(){
                    System.out.println(" Hello from parent ... PARENT");
                }
            }



            //Inheritance example to override final method from child class
                  public class ChildDemoClass extends ParentDemoClass{

/*When tried to override gives compiler error Cannot override the 
final method from ParentDemoClass */

                        public void sayHello(){

                            System.out.println(" Hello from child ... CHILD");

                        }

                    }

            //Inheritance example to access final method from child class

                public class ChildDemoClass extends ParentDemoClass{

                    public void sayHelloFromChild(){
                        System.out.println(" Hello from parent ... CHILD");
                        sayHello();
                    }

                    public static void main(String as[]){
                        new ChildDemoClass().sayHelloFromChild();
                    }
                }

    //OUTPUT is : 
     Hello from parent ................................. CHILD
     Hello from parent ................................. PARENT

最终方法继承只允许访问子类中的最终方法,但不允许覆盖。