12

我在这里的维基百科中读到:

最终类不能被子类化。这样做是出于安全和效率的原因。

我想知道finalJava 可以实现的那种安全性?

4

5 回答 5

13

如果您的课程是最终课程,则没有人可以对其进行子类化。如果没有人可以继承你的 final 类,这意味着你的 final 类的特性不能被其他人通过重用你的类来改变。

假设您是技术提供商,在这里您为某个银行系统提供 API,使用您的 API 客户端将实现其银行系统。

案例:没有最终

这在您的 API 中

class BaseClass{
 public void makeTransaction(){
   }
}

这是客户端代码

class DerivedClass extends BaseClass{
 public void makeTransaction(){
     // naughty client can do something here like:- makeTransaction but transfer 1 dollar for each transaction to my account.
   }
}

案例: WITH FINAL 这是在您的 API 中

final class BaseClass{
 public void makeTransaction(){
   }
}

这是客户端代码

class DerivedClass extends BaseClass{  // not allowed
}

客户必须使用您已经定义的 make transaction。这是 final 如何保护您的代码的一个方面。

于 2013-09-12T05:17:25.787 回答
4

最终类不能被子类化。这样做是出于安全性和效率的原因。我想知道 Java 中的 final 可以实现哪种安全性?

如果一个类不能被子类化,那么您就不能覆盖父类在子类中提供的功能。从设计的角度来看,您实际上是在使用 final 类来完成和执行设计。因此,从这个意义上说,它使您的最后一堂课得到保障。

于 2013-09-12T05:11:00.727 回答
3

final不提供任何安全保障。期望它是愚蠢的。它提供了一种安全性。

尽管您的问题与 java 有关,但我将向您指出 Marshall Cline 的 C++ FAQ,它回答了类似的问题。

http://www.parashift.com/c++-faq/encap-is-not-security.html

[7.8] 封装是一种安全设备吗?

不。

封装!=安全。

封装可以防止错误,而不是间谍活动。

让我补充一点,诸如public,private等关键字final并不能防止故意滥用。它们只是通过防止意外或无意误用来帮助实施设计的结构。

想要替换基类中的功能的程序员可以使用其他方法来做到这一点 - 最简单的是根本不使用该类并做他自己的事情。

如果您想阻止访问或任何其他事情,请在底层操作系统中进行,而不是在您的类库中。

与往常一样,维基百科可能是一个很好的起点,但很少是权威来源。

于 2013-09-12T05:20:56.343 回答
0

如果一个类 if final 比没有其他类继承该类和

无法覆盖方法

. 例如,String 类是 final 的,因此没有人可以覆盖和更改 String 类的方法。

于 2013-09-12T05:20:50.530 回答
0

假设您在银行工作,而您的老板要求一种方法来验证某些客户凭据。

你会有类似的东西:

public class Validation {

    private Customer customer;

    public Validation(Customer customer) {
        this.customer = customer;
    }

    public boolean validate() {
        return customer.isValid();
    }
}

您必须在类或方法 validate 上加上 final(不知道为什么没有人提到它)。这样,如果有人想扩展你的类,他不会改变验证算法(final on method),他根本不会扩展类(final on class)。

于 2013-09-12T05:26:29.337 回答