public方法的继承,不是相当与子类也有了吗?

public方法的继承,不是相当与子类也有了吗?

class Man
{
    private $wife = '小甜甜';
    public function show()
    {
        echo $this -> wife, '<br>';
    }
}

class Tree extends Man
{
    private $wife = '小嘿嘿';
}
$lisi = new Tree();
$lisi -> show();

以上代码打印的结果是:小甜甜。

class Man
{
    private $wife = '小甜甜';
    public function show()
    {
        echo $this -> wife, '<br>';
    }
}

class Tree extends Man
{
    private $wife = '小嘿嘿';
    public function show()
    {
        echo $this -> wife, '<br>';
    }
}
$lisi = new Tree();
$lisi -> show();

以上打印结果是:小嘿嘿


为什么两种结果不一样呢?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

4回答
雨之赞歌 2019-03-15 10:41:06

我的理解是,子类继承了父类的公有和受保护,私有确实没被继承,而子类中只是有一个引用指向父类里面的属性和方法。如你的代码里,在你的第一个结果是"小甜甜",因为你调用的是show()方法,由于子类里的是一个引用,所以调用的是父类中的show方法,所以自然也调用了父类中的$wife,而不是子类中的$wife,之所以能被调用,还是因为在父类中调用了private属于在类里面调用,所以结果是"小甜甜"。
然后第二个结果是"小嘿嘿",因为这时的show方法是在子类中的,所以直接调用了子类的show方法和$wife。

好帮手慕查理 2018-11-23 17:07:01

您好,因为继承,所以$lisi->show();调用父类的show方法,方法中输出的$this->wife,是父类中的属性。原因:属性是私有的,tree类是不能继承$wife属性。例如:

父类中的show方法为private,那么在子类中调用时就会报错。

<?php
class Man
{
    private $wife = '小甜甜';
    private function show()
    {
        echo $this -> wife, '<br>';
    }
}
class Tree extends Man
{
    private $wife = '小嘿嘿';
}
$lisi = new Tree();
$lisi -> show();

当属性改为public关键字时,子类可以继承,因此在子类中将$wife进行了重写,重写之后调用show方法输出的则是子类中的属性值。

<?php
class Man
{
    public $wife = '小甜甜';
    public function show()
    {
        echo $this -> wife, '<br>';
    }
}
class Tree extends Man
{
    public $wife = '小嘿嘿';
}
$lisi = new Tree();
$lisi -> show();

祝学习愉快!

  • 提问者 T时间的朋友 #1
    父类的private属性不能继承,父类的public方法可以继承。为什么子类继承的public方法,可以访问子类没有被继承的private属性呢? 子类继承的public方法,当访问到private属性时,不算实在类外访问吗?
    2018-11-23 18:10:06
  • 好帮手慕查理 回复 提问者 T时间的朋友 #2
    您好,因为在调用时调用的是父类的show方法,那么父类的show方法自然可以调用自己的属性。注意:子类继承父类的方法,那么可以调用父类的public方法,当在调用父类的方法访问到自己的private属性时是类内访问。祝学习愉快!
    2018-11-23 18:44:48
好帮手慕查理 2018-11-23 13:53:47

您好,虽然方法是public,但是属性是private。如果将属性的private修饰词改为public则是输出“小嘿嘿”。

http://img1.sycdn.imooc.com//climg/5bf7956e00010a8311060638.jpg

祝学习愉快!

  • 提问者 T时间的朋友 #1
    我更模糊了。。。子类继承了父类的show()方法,方法中输出的$this->wife,到底是子类的,还是父类的呢?这取决与父类中wife属性的可见性约束吗?为什么是这样?
    2018-11-23 16:06:27
好帮手慕查理 2018-11-23 11:32:22

您好,第一种:$lisi->show();使用的是继承的父类中的show方法,而方法中输出的是$this->wife,也就是父类中属性的值,因此结果是父类中属性值。第二种:$lisi -> show();使用的是子类中的show方法,而子类中wife的值是“小嘿嘿”,因此结果是子类中的属性值。祝学习愉快!

  • 提问者 T时间的朋友 #1
    子类继承的public方法,不是相当于这个方法在子类中也有一份了吗?为什么$this指向的是父类的属性呢?
    2018-11-23 12:31:09
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师