【问题标题】:How to set inherited variable in java?如何在java中设置继承变量?
【发布时间】:2011-12-08 00:46:18
【问题描述】:
public class Atribut {
int classid;

@Override public String toString() {
return Integer.toString(classid);


}

}

我已经创建了这个覆盖方法 toString() 的类。我计划制作许多具有不同classid的子类。问题是我不知道如何设置变量 classid 以在 toString 方法中工作。

public class cas extends Atribut{
int classid=2;


}

问题是如果我创建一个 cas 对象和 toString 方法,它返回“0”而不是“2”。??

【问题讨论】:

    标签: java class inheritance extends


    【解决方案1】:

    我认为这里的大多数答案都归结为风格偏好。 对于这样的小例子,大多数提供的解决方案都可以正常工作。 但是,让我们假设您有一个深几级的继承树。在这种情况下,可能很难理解每个属性的来源,因此使用 setter、getter 和对超类的引用可能会派上用场。我个人的选择如下:

    public class Atribut {
    
        private int firstProp;
        private int thirdProp;
    
        public int getFirstProp() {
            return firstProp;
        }
    
        public void setFirstProp(int firstProp) {
            this.firstProp = firstProp;
        }
    
        ....
    
        @Override
        public String toString() {
            return Integer.toString(this.getFirstProp()) +
                   Integer.toString(this.getThirdProp());
        }
    }
    
    public class Cas extends Atribut {
    
        private int secondProp;
    
        public Cas() {
            super.setFirstProp(1);
            this.setSecondProp(2);
            super.setThirdProp(3);
        }
    }
    

    使用上面提供的方法的替代实现将产生这个 Cas 类:

    public Cas() {
        super(1, 3)
        secondProp = 2;
    }
    

    第二种解决方案有点难以阅读,并且对您设置的属性的描述性较差。

    出于这些原因,这是我更喜欢的风格。此外,重申一下,对于更复杂的示例,第一种方法的好处变得更加明显。

    【讨论】:

      【解决方案2】:

      就像@java_mouse 推荐的那样,只使用父类的变量。

      public class Atribut {
          protected int classid;
      
          public Atribut() {
              classid = 0;
          }
      
          @Override
          public String toString() {
              return Integer.toString(classid);
          }    
      }
      
      public class Cas extends Atribut{
          public Cas() {
              classid = 2;
          }
      }
      

      在构造函数中设置classid的值,然后就可以使用超类的toString()就好了。

      【讨论】:

        【解决方案3】:

        如果子类中的变量已经在父类中可用,为什么要在子类中隐藏它?为什么不使用相同的变量?

        如果您使用相同的变量,问题会自动解决。如果必须继承属性,请不要复制它。

        【讨论】:

          【解决方案4】:

          我对这类事情的首选技术是使用构造函数参数:

          public class Parent {
              // Using "protected final" so child classes can read, but not change it
              // Adjust as needed if that's not what you intended
              protected final int classid;
          
              // Protected constructor: must be called by subclasses
              protected Parent(int classid) {
                  this.classid = classid;
              }
          
              @Override
              public String toString() {
                  return Integer.toString(classid);
              }
          }
          
          public class Child extends Parent {
              public Child() {
                  // The compiler will enforce that the child class MUST provide this value
                  super(2); 
              }
          }
          

          【讨论】:

            【解决方案5】:

            当您隐藏变量时,父类中的变量将用于那里的方法。

            如果你想这样做,我会这样做

            class Atribut {
                int classid = 0;
            
                protected int classid() { return classid; } // points to Attribut.classid
                public String toString() {
                    return Integer.toString(classid());
                }
            
            }
            

            然后在你的子类中,你可以重写方法

            class cas {
                int classid = 2;
                protected int classid() { return classid; } // points to cas.classid
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-08
              • 2011-04-24
              • 1970-01-01
              • 2023-02-09
              • 2013-06-30
              相关资源
              最近更新 更多