Java 对于多态类,可以使用受保护的实例变量吗?

Java 对于多态类,可以使用受保护的实例变量吗?,java,polymorphism,Java,Polymorphism,我有一个超类叫做Seat(用于音乐厅) GoldSeat、SilverSeat和BronzeSeat是它的子类 我总是阅读以保持数据私有,从而启用封装 如果我需要编写在子类中使用这些实例变量的方法,是否可以将它们设置为受保护的?大多数类似的堆栈溢出问题并不涉及正确的面向对象设计,而是关注访问修饰符之间的差异以及每个修饰符的处理效率或技术差异。如果我错过了一个,我会提前道歉,并愉快地回顾它 我可以在子类中使用getter方法来获取实例变量,但在本例中这似乎很奇怪,但至少数据是私有的 调用自己的访问

我有一个超类叫做
Seat
(用于音乐厅)

GoldSeat
SilverSeat
BronzeSeat
是它的子类

我总是阅读以保持数据
私有
,从而启用封装

如果我需要编写在子类中使用这些实例变量的方法,是否可以将它们设置为受保护的
?大多数类似的堆栈溢出问题并不涉及正确的面向对象设计,而是关注访问修饰符之间的差异以及每个修饰符的处理效率或技术差异。如果我错过了一个,我会提前道歉,并愉快地回顾它


我可以在子类中使用getter方法来获取实例变量,但在本例中这似乎很奇怪,但至少数据是
私有的

调用自己的访问器方法并不“奇怪”。这其实很有道理。如果您的访问器方法包含的代码超出了简单的set/get方法,那么您肯定要调用它们。 也许重新考虑一下你对“纯”OO的厌恶。 当然,它还保持封装

让他们受到保护被认为是可以接受的吗

对。我认为使用
protected
修饰符不会违反封装法则。只允许子类访问实例,我们仍然控制其他人应该访问什么以及谁可以访问实例

我可以在子类中使用getter方法来获取实例 变量,但在这种情况下这似乎很奇怪


在某些情况下,您希望在其他人访问该实例之前先进行一些预处理,然后才能将预处理放入Getter中。

是的,这被认为是可以接受的。好的,有些事情需要仔细考虑。访问器方法只返回实例变量值,仅此而已。edit*这看起来很奇怪,因为我的子类继承了实例变量,但是为了操纵它们,调用了一个超类访问器方法——也许这并不奇怪(我是一个初学者)。我从Smalltalk中的OO开始,那里的一切都是私有的。有人可能会说继承是OO模型中最薄弱的部分,因为它违反了封装——正如您在上面指出的那样——并且经常没有正确使用。例如,您在不同的座位上保留了哪些不同的属性?如果没有任何真正不同的属性(不是值属性),那么它们就不是真正的子类。请参阅Peter Coad的Java设计,了解继承与组合的良好处理方法。访问器方法不应该是实例变量的简单传递,或者有什么意义?访问器方法可能在setter中进行一些处理——应用规则和验证或转换,其中一个方法可能提供许多不同的getter;例如:getAsString、getAsXML表示字符串,或getAsFloat、getAsDouble、getAsInt表示数字。关于封装的核心内容之一是实例变量的形式是隐藏的…封装的-因此get/set不会以任何方式公开它。通过在子类中调用实例变量的get/set,您得到了保护。非常非常有趣的见解。非常感谢。今天我要和我的讲师聊一聊,问他对这项作业喜欢什么。至少,即使我是个初学者,我也可以把你的观点运用到未来的工作中,对这个想法做更多的研究/思考。我需要知道的是。我明白你们的观点,若使用受保护的修饰符,那个么我们就有责任编写定义谁可以访问数据和实例的代码。因此,考虑到这一责任,整个包的类都可以访问它们是可以的吗?这个链接可能有助于解释这一点。编辑*-这就很好地解释了为什么受保护允许包访问。谢谢,事实上,它可以,很容易。但是,如果您更改了超类中的实例var名称或实现,那么它可能会在子类中中断。这就是为什么我们称自己的getter和setter为getter和setter的原因之一,即使在子类中也是如此。