关键字“Private”和“Final”有啥区别?
Posted
技术标签:
【中文标题】关键字“Private”和“Final”有啥区别?【英文标题】:What is the difference between the keyword 'Private' and 'Final'?关键字“Private”和“Final”有什么区别? 【发布时间】:2015-07-28 15:20:40 【问题描述】:在 php 中 Private
和 Final
之间存在混淆。
例如我有 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 不会改变该方法的任何可访问性。它只定义另一个类是否可以覆盖它(当它可以访问它时)。但是访问是由他们的关键字定义的:private
、public
、protected
知道了,非常感谢 :-)
不客气,我应该把它转换成答案吗?
【参考方案1】:
方法的属性final
用于向编译器说明不能在其他地方覆盖给定方法。
因此,如果我们将函数声明为final
,然后尝试在其他地方覆盖它,我们将得到warning
或fatal 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
与方法的可见性无关。方法的可见性由以下关键字定义:public
、protected
和 private
。
final 关键字定义了另一个类是否可以覆盖该方法(如果一个方法是最终的,则它不能被另一个类覆盖),当另一个类可以访问该方法时。否则它甚至无法访问该方法,因此它既不能使用/调用该方法,也不能覆盖它。
也只有方法可以是最终的,它不能与属性一起使用。
A、B 和 C 是正确的,正如我上面所说的关键字 final 与可见性没有任何关系,所以 D 不正确。
有关更多信息,请参阅相应的手册页:
final
keyword
property and method visibility
【讨论】:
以上是关于关键字“Private”和“Final”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
c#sealed 和 Java 的 final 关键字在功能上有啥区别吗? [复制]
方法(String str)和方法(Final String str)有啥区别[重复]