深入理解类的继承和访问控制

场景:父类某 public method 使用了 private 属性或方法,则子类继承此 public method 并调用时,其中的private 属性或方法会被替换成子类自己的么?

<?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?

先来看下 public protected private 的区别

174905_YKru_252076.jpg

public 的 name 就是个普通的键值变量,没有任何限制,所以对象可以访问,子类可以继承

protected 的 age 则被 protected 修饰 这是用来限定对象访问的,子类是可以继承的

private 的 address 则被 Person:protected 修饰, 限定了所属类和外部访问控制

继续看,如果我在本类中定义一 public方法,输出这些信息,同时子类去调用此放方法

180231_zqLo_252076.jpg

注意我给三个不同权限的变量标注的不同的颜色,结合我们上面说的这些变量真正的名字可以得知 

public 的 name 是可以被任何子类或对象修改的

protected 的 age 只能被子类修改,对象无权访问

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 可以将上下文切换到子类中

234101_vIMf_252076.jpg

不知大家能明白我想说明什么嘛,可能工作中不会去钻这种牛角尖,但我发现了就....出不来了...

私有变量所占据的位置是和本类死死绑定在一起的,他不会被子类的变量干扰

我们张口就来的往往是 private 修饰的方法和属性不会被子类继承,不能被对象直接调用和访问,本文则说明一点,私有变量占据的位置是不会被更改的,即便是在public方法中,此方法被继承100级(注意,我说的是继承,不重写),你在第100级调用此public方法时,里面的 $this->address 私有变量还是 Person 的,而不是你子类的,其他的 public 和 protected 则可被子类的去替换掉,他们的限定都是当前类

不只是 PHP,JAVA,PYTHON我都试过了,都如此


转载于:https://my.oschina.net/sallency/blog/640418

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值