在C#或Java中进行子类化时是否可以覆盖私有成员?

时间:2011-11-21 11:12:50

标签: c# java oop inheritance

我正在学习C#和Java,并对继承有疑问。

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

8 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

Java中的字段只是隐藏而实际上没有被覆盖(这并不意味着我们在尝试时会遇到编译时错误,而不是真正意义上的覆盖它们)。覆盖意味着应该根据对象的运行时类型调用成员,而不是基于声明的类型。但是Java中字段的绑定始终是静态的,因此它仅基于对象引用的声明类型。阅读文章中有关静态绑定的更多信息 - 动态绑定与静态绑定>>

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

答案 2 :(得分:5)

不,你不能覆盖private元素,它们实际上是最终的(因为从子类中永远不会看到它们被覆盖。)

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

答案 3 :(得分:3)

从技术上讲,你没有超越它。

如果子类具有名称的成员,并且超类具有标记为私有的同名成员,则它们是两个不同的成员。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

不,您无法在JavaC#中覆盖。您可以在C++

中执行此操作

答案 6 :(得分:1)

使用protected代替privated,受保护只为他的孩子提供方法

答案 7 :(得分:0)

答案是否定的!您可能需要使用“保护”关键字进行调查。

如果使用多个程序集,另请参见“内部保护”以了解非方法。

另请参见'private protected',例如基类中的抽象方法。

然后在派生类中,您可以将那些方法隐藏在派生类之外。

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

您可以类似地使用属性,字段等来执行此操作,如here所示。

顺便说一句,一直使用“ final”一词的人都是JAVA书呆子。 C#中没有'final'关键字,因此最好的选择是使用'sealed'。