【问题标题】:Polymorphism - access specifier changed in derived class多态性 - 派生类中的访问说明符已更改
【发布时间】:2011-02-06 19:37:19
【问题描述】:

您好,我只是想了解以下行为.. 我在基类和派生类中定义了相同的方法 - gg() 具有不同的访问权限

Class Base  
{  
// some thing   
**private** Integer gg(){  
 //return something   
 }  
}

Class Derived{  
// something  
**public** Integer gg(){  
//return something  
}  
}

在我初始化变量时的 main 方法中

  Base d = new Derived()  

并尝试调用 d.gg() 它说 Base.gg() 是私有的。修改访问说明符是否会使方法调用恢复为基类方法?当我将基类中 gg() 的访问说明符更改为公共时,它会像多态性一样调用派生类中的方法。

根据我所读到的关于多态性的内容,可以在派生类中减少访问说明符的限制,这里就是这种情况。

【问题讨论】:

    标签: java polymorphism


    【解决方案1】:

    通过对基类的引用访问对象意味着您打算通过基类指定的接口访问它。如果你在基类中声明了一个方法private,那么你就不能通过对基类的引用来访问它!

    考虑一下如果不是这种情况会发生的荒谬:

    Base b;
    
    if (some condition) {
        b = new Base();
    }
    else {
        b = new Derived();
    }
    
    b.ggg();  // Ok, or not?
    

    【讨论】:

    • 我帖子中的对象 d 存储了对派生类的引用,对吗?那么变量类型是否决定了方法的访问权限,而不是它所指的实际对象?。
    • 好的,我现在明白了。谢谢。
    【解决方案2】:

    在 Java 中,超类的私有成员在派生类中可见。因此,在派生类中不可能

    • 引用超类的私有成员 - 它们存在但您无法访问它们,它们是超类的内部细节,不打算在派生类中使用,
    • 覆盖私有方法

    因此,在您的示例中,Derived.gg() 方法不会覆盖 Base.gg() 方法。 Derived.gg() 只是一个与Base 类中的方法同名的方法,但它们没有任何共同之处。也没有名称冲突,因为 Derived 类不知道 Base.gg() 方法。

    【讨论】:

    • 并不是它们没有继承,只是它们从派生类中可见
    • @Oli Charlesworth,你是对的。我不是特别的 enoguht - 我改变了我的措辞。
    猜你喜欢
    • 2013-10-22
    • 2019-04-17
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2011-08-27
    • 2014-12-26
    相关资源
    最近更新 更多