【问题标题】:Java Constructor errorJava 构造函数错误
【发布时间】:2011-06-05 17:05:34
【问题描述】:

我收到构造函数错误。为了使这段代码工作,我需要在 B 类中使用 super 吗?

 class A {  
      protected String s ;
      A (String s) {
           this.s = s  ; 
         }
  }

 class B extends A {
     String s ;
     B(String s) {
        this.s  = s ;    
         }
   }

【问题讨论】:

    标签: java constructor compiler-errors


    【解决方案1】:

    是的,你需要从 B 的构造函数中调用超级构造函数。如果您在构造函数的开头没有指定this(...)super(...),则会为您插入对super() 的隐式调用——对超类的无参数构造函数的调用。在这种情况下,您在A 中没有无参数构造函数 - 因此您需要显式指定要调用的构造函数以及参数。

    您可能希望在 B 中使用另一个名为 s 的变量...

    我怀疑你想要这个:

    class B extends A {
        B(String s) {
            super(s);
        }
    }
    

    如果您确实还在B 中声明了一个名为s 的变量,了解会发生什么很重要。然后,对于B 的每个实例,您将有两个独立变量 - 一个在A 中声明,一个在B遮蔽它。他们可以很容易地采用不同的值......这会非常令人困惑。

    请注意,另外,将字段设为私有几乎总是一个好主意——此时您并不真正知道您的超类声明了哪些变量,因为您无法访问它们。如果您碰巧隐藏了一个变量,那至少不会导致任何明显的歧义(当然,这是由规范处理的)。但是,通常一个变量与其超类中的一个变量同名仍然是一个错误 - 这表明您对于相同的信息有两个不同的真实来源。

    【讨论】:

      【解决方案2】:

      是的,您需要使用 super(); 拨打 A 类电话

      请记住,您的子类将提供对超类构造函数的自动 (super()) 调用,仅当且仅当您在超类中有无参数构造函数。

      一旦你为你的超类定义了一个参数化的构造函数,你的子类需要从它的构造函数中调用super();。 每当您的子类继承自 Super 类时,您都需要使用 super(); 调用 Superclass。

      你需要像这样重写你的 B 类代码:

      class B extends A {
          B(String s) {
              super(s);   // Calls A's constructor ..
          }
      }
      

      注意: super(s); 必须是 B 的构造函数中的第一条语句。

      【讨论】:

      • 这不是真正的问题,语言给了他对空超级构造函数的隐式调用。问题是,一旦他重写了超级构造函数并且没有空构造函数,那么隐式调用就无效了。
      【解决方案3】:

      简短回答:是的。

      所有子类都需要包括对超类的构造函数的调用作为它们的第一个动作。如果您没有显式插入调用,则会推断出对 super() 的调用。

      在超类没有无参数构造函数的情况下,您需要自己提供参数(从而进行调用),如下所示:

      class B extends A {
          String s;
          public B(String s) {
              super(s); // Or pass in any other argument to super's constructor
              this.s = s;
          }
      

      【讨论】:

        【解决方案4】:
        class A {
            protected String s ;
            A(String s) {
                this.s = s;
            }
        }
        class B extends A {
            B(String s) {
                super(s);
            }
        }
        

        B 类中的字段 String s 隐藏了 A 类中的同名字段。如果您需要 B 中的单独字符串字段,您应该将其命名为其他名称。

        【讨论】:

          【解决方案5】:

          首先,您不需要在 B 中创建相同的变量和构造函数,因为它们已经存在(B 扩展了 A)。你可以这样做:

          public class test {
          A a = new A ("This is a");
          B b = new B ("This is b");
              private class A {  
                  protected String s ;
                  A ( String s ) {  this.s = s; }
                  public String getS() { return s; }
              }
              private class B extends A {
                  B (String s) { super (s); }
              }
          
              public static void main (String [] args) {
                  test t = new test();
          
                  System.out.println(t.a.getS());
                  System.out.println(t.b.getS());
          
                  /*
          Output will be This is a and This is b
                   */
              }
          }
          

          你是对的,你必须打电话给super(s);

          祝你好运!

          【讨论】:

            猜你喜欢
            • 2018-01-04
            • 1970-01-01
            • 2013-04-23
            • 1970-01-01
            • 2015-02-05
            • 2021-12-14
            • 2023-03-14
            • 2012-02-13
            • 1970-01-01
            相关资源
            最近更新 更多