深刻理解類的繼承和訪問控制

場景:父類某 public method 使用了 private 屬性或方法,則子類繼承此 public method 並調用時,其中的private 屬性或方法會被替換成子類本身的麼?php

<?php
class Foo {
    private $name = "foo";
    public function getName {
        echo $this->name .PHP_EOL;
    }
}

class Bar extends Foo {
    private $name = "bar";
}

(new Bar())->getName();
?>

結果會輸出什麼呢? bar ? foo?this

先來看下 public protected private 的區別spa

public 的 name 就是個普通的鍵值變量,沒有任何限制,因此對象能夠訪問,子類能夠繼承code

protected 的 age 則被 protected 修飾 這是用來限定對象訪問的,子類是能夠繼承的對象

private 的 address 則被 Person:protected 修飾, 限定了所屬類和外部訪問控制繼承

繼續看,若是我在本類中定義一 public方法,輸出這些信息,同時子類去調用此放方法get

注意我給三個不一樣權限的變量標註的不一樣的顏色,結合咱們上面說的這些變量真正的名字能夠得知 io

public 的 name 是能夠被任何子類或對象修改的function

protected 的 age 只能被子類修改,對象無權訪問class

private 的 address 則是明確的只存在於本類當中,getInfo 訪問的 name 和 age 都是能夠被子類操做替換的,上下文中並無規定這裏必定是 Person:private 的佔位符,但 address 不一樣, address 被 Person:private 修飾,告訴 getInfo,不管什麼時候,這裏只能是哥,哥是 Person 的 address 

因此,當咱們子類調用 getInfo時你會發現, name 和 age 都被替換成了 Boy 本身的,惟獨 address,依然是 Person 的,緣由很明確,做爲Person private 的 address 在被訪問時,其所處的上下文明確的定義這裏是 address:Person:private 的位置,而不像 public 或 protected 能夠將上下文切換到子類中

不知你們能明白我想說明什麼嘛,可能工做中不會去鑽這種牛角尖,但我發現了就....出不來了...

私有變量所佔據的位置是和本類死死綁定在一塊兒的,他不會被子類的變量干擾

咱們張口就來的每每是 private 修飾的方法和屬性不會被子類繼承,不能被對象直接調用和訪問,本文則說明一點,私有變量佔據的位置是不會被更改的,即使是在public方法中,此方法被繼承100級(注意,我說的是繼承,不重寫),你在第100級調用此public方法時,裏面的 $this->address 私有變量仍是 Person 的,而不是你子類的,其餘的 public 和 protected 則可被子類的去替換掉,他們的限定都是當前類

不僅是 PHP,JAVA,PYTHON我都試過了,都如此

相關文章
相關標籤/搜索