在c#或Java中创建子类时是否可以重写私有成员?

本文关键字:重写 成员 是否 Java 子类 创建 | 更新日期: 2023-09-27 18:15:14

我正在学习c#和Java,有一个关于继承的问题。

是否可以在超类(基类)中重写私有成员?在我看来,这是不正确的,因为访问修饰符会阻止成员被访问。

在c#或Java中创建子类时是否可以重写私有成员?

这不是一个愚蠢的问题,但它给出了隐藏变量的另一个概念。

字段在Java中只是隐藏而不是实际上覆盖(这并不意味着我们会得到一个编译时错误,而不是真正意义上的覆盖)。重写意味着应该基于对象的运行时类型调用成员,而不是基于声明的类型。但是Java中字段的绑定总是静态的,因此它只基于对象引用的声明类型。阅读更多关于静态绑定的文章-动态绑定vs静态绑定>>

在方法的情况下,只有那些继承的方法被覆盖,因此静态方法也不被覆盖,但只被隐藏,它们只遵循静态绑定。私有成员(方法或字段)既不隐藏也不重写。它们也遵循静态绑定,不能从任何其他类(包括子类)直接访问,除了拥有它们的类。记住,隐藏并不意味着我们不能从子类访问成员。因此,不要混淆不可访问(在私有成员—字段或方法的情况下)和隐藏。

private方法在子类中不可见,因此它们不会被继承。

不,您不能重写private元素,它们实际上是final的(因为它们永远不会从要重写的子类中可见)

您可以在子类中声明具有相同名称的private元素,但这不会覆盖父类中的元素-它只是另一个与父类中相同名称的private方法。

从技术上讲,您没有重写它。

如果子类有一个带名字的成员,而父类有一个同名的成员,但标记为private,则它们是两个不同的成员。

使用protected代替privated, protected使一个方法只对他的子节点可见

如果父类和子类都在同一个包中,你可以覆盖未标记为PRIVATE和FINAL的方法,如果它们在不同的包中,那么你可以覆盖PUBLIC或PROTECTED(也不应该是FINAL)的方法。

不,你不能在Java或c#中重写。

答案是否定的!你可以考虑使用'protected'关键字。

参见'internal protected'用于非方法,如果使用多个程序集。

参见'private protected'用于基类中的抽象方法,例如

然后在你的派生类中,你可以隐藏这些方法,不让它在你的派生类之外。

有一种方法可以通过反射或表达式树来实现,但它是显式的,需要一些工作。

你可以用类似的方法处理属性、字段等…如下图所示。

顺便说一句,一直用"final"这个词的人是JAVA呆子。c#中没有"final"关键字,所以你最好的选择是使用"sealed"。