在Scala中,使用final关键字声明的变量无法在程序中进一步更改。这意味着它在父类中仅声明一次,并且在整个程序中将保持不变(不变)。
语法:
final val variable_name : datetype = value;
在许多情况下,我们会遇到需要某些实例保持不变的情况,因此请使用final关键字使它们不受子类更改的影响。
示例
让我们以汽车为例,默认情况下,每辆汽车都有四个车轮,因此我们可以使最终变量的车轮数成为变量,以便在继承基类car的任何类中都不能更改它。
码:
class car{ final val wheels : Int = 4; } class honda extends car{ val wheels : Int = 3; override def wheel(){ println(wheels) } } object MyClass { def main(args: Array[String]) { var newcar = new honda(); newcar.wheel() } }
输出结果
error: overriding value wheels in class car of type Int; value wheels cannot override final member val wheels : Int = 3; ^ error: method wheel overrides nothing override def wheel(){ ^ two errors found
在Scala中,方法也可以声明为final,因此子类都无法覆盖该方法。这使得方法通用代码中的代码可以被其他人使用,但不能被操纵。
语法:
final def method_name() { }
示例
让我们以汽车为例,有些功能就像每辆汽车的转向一样。因此,可以将此类汽车的转向方法定义为final,以便其他任何类都无法覆盖它。
码:
class car{ final val wheels : Int = 4; final def drive(){ println("!! Broom !") } } class honda extends car{ override def drive(){ println("!! Broom Broom !") } } object MyClass { def main(args: Array[String]) { var newcar = new honda(); newcar.drive() } }
输出结果
error: overriding method drive in class car of type ()Unit; method drive cannot override final member override def drive(){ ^ one error found
通过将final关键字与类一起使用,可以使该类不受继承的影响,即无法继承使用Final关键字定义的类。
语法:
final class class_name { }
示例
如果将汽车类设置为最终类,则不能从另一个类访问该类的任何对象。
码:
final class car{ val wheels : Int = 4; def drive(){ println("!! Broom !") } } class honda extends car{ override val wheels = 34; } object MyClass { def main(args: Array[String]) { var newcar = new honda(); newcar.drive() } }
输出结果
error: illegal inheritance from final class car class honda extends car{ ^ one error found