Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在子类中实现setter/getter的最佳实践?_Java_Inheritance_Methods_Getter Setter - Fatal编程技术网

Java 在子类中实现setter/getter的最佳实践?

Java 在子类中实现setter/getter的最佳实践?,java,inheritance,methods,getter-setter,Java,Inheritance,Methods,Getter Setter,如果我有一个必须保留某些功能的超类,因此需要setter/getter(我意识到这并不理想,但这无关紧要),那么当我实现一个子类时,我是否应该在子类中包含对超类setter/getter的调用,即使我可以在技术上调用它们而无需再次编写代码 我在下面贴了一个例子来说明我的意思 class Parent { private int x; public void myMethod() { // Code here. } public void setX(int

如果我有一个必须保留某些功能的超类,因此需要setter/getter(我意识到这并不理想,但这无关紧要),那么当我实现一个子类时,我是否应该在子类中包含对超类setter/getter的调用,即使我可以在技术上调用它们而无需再次编写代码

我在下面贴了一个例子来说明我的意思

class Parent {

   private int x;

   public void myMethod() {
      // Code here.
   }

   public void setX(int y) {
       x = y;
   }

   public int getX() {
       return x;
   }


}

class Child extends Parent {

   @Override 
   public void myMethod() {
      super.myMethod();
      // Different code here.
   }

   // Are the inclusions below really necessary? 
   public void setX(int y) {
       super.setX(y);
   }

   public int getX() {
       super.getX();
   }
}

继承的全部要点是,如果超类方法满足您的需要,则不必在子类中重新实现方法。只有当子类方法需要做一些不同/更多的事情时,才应该重写

我应该在子类中包含对超类的setters/getter的调用吗

首先,如果您希望孩子能够访问
private int x
,请将private更改为protected


我能想到何时返回/设置不同数据的唯一原因是,例如,在设置
x
之前,子类在
y
上执行一些额外的计算。否则,如果您只是委托给super方法,那么该定义是不必要的

如果需要专门从父对象访问私有字段,请使用超类访问器。如果在子类中定义了不同的实例字段,则需要单独的getter来访问这些字段/变量


否则,只需使用预定义的超级方法,这些超级方法由扩展父类的所有类继承。

在默认情况下,覆盖方法只调用它们的超级版本,而不覆盖它们

换言之:

@Override
void foo() { super.foo(); }
结果绝对与行为一致。。。根本不重写该方法


这样,相反,你应该考虑让这些吸收器和设置器<强>最终< /强>以防止子类重写它们!作为记录:当重写方法时,您总是希望在这些方法上添加@Override注释(这样编译器可以告诉您何时您只认为您正在重写一个方法)。

感谢您的接受;我没想到会这样。我用更多的信息更新了我的答案;旁注:考虑到你对“继承”的理解是不正确的;也许退一步对您来说是有意义的——也许您认为基类上的“我需要getter/setter”方法也可能是错误的。拥有能手并不是件好事,但允许二传手是一件应该避免的事情!我正在完成一个练习,其中说明我应该同时使用getter和setter方法。不幸的是,我读过的一些教学材料更关注教学功能,而不是最佳实践,这让我感到困惑。然而,你的回答是澄清的。