关键字“Private”和“Final”有啥区别?

Posted

技术标签:

【中文标题】关键字“Private”和“Final”有啥区别?【英文标题】:What is the difference between the keyword 'Private' and 'Final'?关键字“Private”和“Final”有什么区别? 【发布时间】:2015-07-28 15:20:40 【问题描述】:

phpPrivateFinal 之间存在混淆。

例如我有 3 个类:

    A 类(父类) B 类(子类) C 类(其他类)

我的理解:

A:Public变量和方法可供A类、B类和C类访问 B:私有变量和方法只能由 A 类访问。 C:受保护的变量和方法只能由 A 类和 B 类访问 D:Final 方法只能由 A 类访问,B 类不能访问。

我的问题是:

使用private后我们可以实现类似final的功能,那为什么要使用final呢?

我问这个问题只是为了我自己的澄清。

【问题讨论】:

RTM 如果可见性不是私有的,则子类可以访问最终方法。您只是不能在子类中覆盖它们。所以不同的是最终方法仍然可以被其他类访问,具体取决于可见性,但你不能像普通方法一样覆盖它们 表示a类的final方法b类不能访问,c类可以访问。 这取决于它的可见性。关键字 final 不会改变该方法的任何可访问性。它只定义另一个类是否可以覆盖它(当它可以访问它时)。但是访问是由他们的关键字定义的:privatepublicprotected 知道了,非常感谢 :-) 不客气,我应该把它转换成答案吗? 【参考方案1】:

方法的属性final 用于向编译器说明不能在其他地方覆盖给定方法。

因此,如果我们将函数声明为final,然后尝试在其他地方覆盖它,我们将得到warningfatal error

【讨论】:

【参考方案2】:

最终的类或方法不能被覆盖。

来自 php 文档

PHP 5 引入了 final 关键字,它通过在定义前加上 final 来防止子类覆盖方法。如果类本身被定义为 final 则不能扩展。

来自 php 文档的示例:

<?php
class BaseClass 
   public function test() 
       echo "BaseClass::test() called\n";
   

   final public function moreTesting() 
       echo "BaseClass::moreTesting() called\n";
   


class ChildClass extends BaseClass 
   public function moreTesting() 
       echo "ChildClass::moreTesting() called\n";
   

// Results in Fatal error: Cannot override final method BaseClass::moreTesting()
?>

更多详情:http://php.net/manual/en/language.oop5.final.php

【讨论】:

【参考方案3】:

为了清楚起见,关键字final 与方法的可见性无关。方法的可见性由以下关键字定义:publicprotectedprivate

final 关键字定义了另一个类是否可以覆盖该方法(如果一个方法是最终的,则它不能被另一个类覆盖),当另一个类可以访问该方法时。否则它甚至无法访问该方法,因此它既不能使用/调用该方法,也不能覆盖它。

也只有方法可以是最终的,它不能与属性一起使用。


A、B 和 C 是正确的,正如我上面所说的关键字 final 与可见性没有任何关系,所以 D 不正确。

有关更多信息,请参阅相应的手册页:

final keyword property and method visibility

【讨论】:

以上是关于关键字“Private”和“Final”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

c#sealed 和 Java 的 final 关键字在功能上有啥区别吗? [复制]

方法(String str)和方法(Final String str)有啥区别[重复]

受保护和私有有啥区别? [复制]

java语言中error和exception有啥区别?final和finally有啥区别?

Scala中的final类和sealed类有啥区别?

Java中 final和static修饰的变量有啥区别?