Java-Final方法

时间:2020-02-23 14:36:35  来源:igfitidea点击:

在本教程中,我们将学习Java编程语言中的Final方法。

在上一教程中,我们了解了用于创建常量的Final变量。
随时检查一下。

我们知道,子类继承了父类的所有可继承方法和变量。

在方法覆盖教程中,我们了解到子类可以覆盖父类的继承方法。

但是在某些情况下,我们可能不希望子类重写父类的方法。
这就是我们使用的"最终"方法。

Final方法

如果我们不希望某个方法被覆盖,则将方法的修饰符设置为" final"。

语法

class MyClass {
  
  final type myMethod(param_list) {
    //some code goes here...
  }
}

其中" MyClass"是类的名称,并且具有名为" myMethod"的方法。

该方法的返回类型由type表示。

修饰符设置为" final",因此,任何继承该类的类都不能覆盖该方法。

例子1

在下面的示例中,我们的父类或者超类" Hello"具有标记为" final"的" greetings"方法。

因此,子类或者子类" Awesome"将无法覆盖继承的" greetings"方法。

class Hello {

  //this method is marked as final
  //so any child class inheriting
  //this class won't be able to
  //override this method
  final void greetings() {
    System.out.println("Hello World");
  }
}

class Awesome extends Hello {
  
  //overriding of greetings method not allowed
  /**
   * void greetings() {
   *   System.out.println("Action");
   * }
   */
  
  void message() {
    System.out.println("Message");
  }
}

//main class
public class Example {
  public static void main(String[] args) {

    //creating an object
    Awesome obj = new Awesome();

    //calling methods
    obj.greetings();
    obj.message();
  }
}
$javac Example.java 
$java Example
Hello World
Message

如果我们尝试覆盖final方法,那么我们将得到以下错误。

$javac Example.java 
Example.java:15: error: greetings() in Awesome cannot override greetings() in Hello
  void greetings() {
       ^
  overridden method is final
1 error

示例2

在下面的示例中,我们有一个Box类,并且它具有一个最终方法getVolume,该方法不能被覆盖。

然后,我们还有另一个类" GiftBox",它继承了" Box"类。

我们使用super关键字来调用父类的构造函数并初始化GiftBox的尺寸。

class Box {

  //member variables
  private double length;
  private double width;
  private double height;

  //constructor
  Box() {
    this.length = 0;
    this.width = 0;
    this.height = 0;
  }

  //constructor with parameters
  Box(double length, double width, double height) {
    this.length = length;
    this.width = width;
    this.height = height;
  }

  //this method is set as final
  //so it can't be overridden in
  //the child class
  final double getVolume() {
    return this.length * this.width * this.height;
  }
}

//this class is inheriting
//the Box class
class GiftBox extends Box {

  //member variables
  private double price;
  
  //constructor
  GiftBox() {
    //calling the constructor
    //of the parent class Box
    super();

    //setting the price
    this.price = 0;
  }

  //constructor with parameters
  GiftBox(double price, double length, double width, double height) {
    
    //calling the constructor
    //of the parent class Box
    super(length, width, height);

    //setting the price
    this.price = price;
  }

  //the getVolume method is inherited
  //but we can't override it
  //as it is a final method
  //in the parent class Box
}

//main class
public class Example {
  public static void main(String[] args) {

    //instantiate object
    GiftBox obj = new GiftBox(99, 5, 4, 3);

    //calling the method
    double volume = obj.getVolume();

    //output
    System.out.println("Volume of the GiftBox: " + volume);
  }
}
$javac Example.java 
$java Example
Volume of the GiftBox: 60.0