关于何时使用私有域和受保护字段的困惑

时间:2015-04-11 10:15:19

标签: java inheritance private public access-modifiers

我在SO中看到用户说受保护的字段很糟糕,因为它会随着代码的增长而引入问题。请参阅以下代码。

public class Car {
    private String modelName;
    private int yearReleased;

//getters and setters

}

如果Car类由名为ToyotaCar的类扩展

public class ToyotaCar extends Car{
   // Toyota specific stuff
}

我希望我的ToyotaCar对象有modelNameyearReleased个字段。这就是为什么我决定延续Car class。但私有成员不是由子类继承的(即使我可以使用公共getter和setter访问这些字段)。现在我的困惑在于我是否应该将Car类中的文件保护为保护而不是私有。但人们说这会带来问题。

这是否意味着无论你总是写什么课,都要把字段设为私有?

如果是,那么使用protected关键字的实例是什么?它只适用于我们计划在子类中使用的方法吗?

3 个答案:

答案 0 :(得分:5)

你自己钉了它:一个好的做法就是默认将所有东西都设为“私密”。然后,您的特定设计可能需要例如能够使用某些属性或(最好)子类内的某些方法。在这种情况下,你需要将它们移向'受保护' - 但仅限于那种情况。

请记住,使用访问器(getter& setters)是完全可以的,并且可以在不破坏封装的情况下完成。

答案 1 :(得分:1)

如果从子类更改字段存在严格的紧迫性(由于特定的设计/模式),那么您应该将您的类字段声明为protected

  

如果不是这样,那么通常更好的方法是执行相同的操作   在父类更新中使用public / protected成员方法   父类中的那些私有字段然后调用它   来自子类'对象的公共/受保护成员方法。

这样,您可以通过从子类'对象调用parent的类成员方法来更新这些父类的私有字段来实现实现。

答案 2 :(得分:-1)

用于声明变量的受保护关键字用于使这些实例变量对同一个包中的所有其他类可见,并且还使用类[子类]来扩展涉及这些受保护变量的超类。

当然,您可以使用private或protected modifiers声明变量。但是当您将变量声明为private时,您可以隐藏变量,以便其他类无法直接访问它,另一方面,如果您声明带有protected的变量然后你让变量直接访问它而不使用任何getter方法,这违反了OOP原则。

所以从我的观点来看,由于Car是所有其他类的超类,如ToyotaCar等等。将超类中的变量声明为私有,并在子类中使用getter和setter方法来读取和写入取决于根据你的需要。通过这样做,你遵守OOP原则。

希望这有帮助。

谢谢