【问题标题】:cannot reference before supertype has been called java在调用超类型之前无法引用 java
【发布时间】:2015-06-17 14:51:24
【问题描述】:

我有一堂课Ship

public class Ship {

    private String name;
    private boolean loaded;
    private int size;
    private boolean bIsDefeated;
    private int gunpower;

    public Ship(int size, int gunpower, String name) {
        this.size = size;
        this.gunpower = gunpower;
        this.name= name;
        loaded = true;
        bIsDefeated = false;
    }
}

Submarine

class Submarine extends Ship {

    private final String NAME = "U-Boot";
    private final int SIZE = 2;
    private final int GUNPOWER = 1;

    public Submarine(){
        super(SIZE,GUNPOWER,NAME);  //Here it gets underlined
    }
}

谁能告诉我为什么这是不可能的?

【问题讨论】:

  • 您看到的错误究竟是什么?从你的问题标题看不清楚。
  • NAME 不是静态的,此时无法调用。
  • 喜欢所有答案的反对票。谢谢
  • 我已经更新了。我必须先翻译代码让你更容易理解,显然我忘记了一些要翻译的词。我不知道反对票,没有这样做

标签: java constructor instance


【解决方案1】:
public UBoot(){
   super(SIZE,GUNPOWER,NAME);
}

看起来您正在尝试创建一个名称与类不同的构造函数。试试static factory method

public static Submarine uboot() {
    // something like
    Submarine s = new Submarine(UBOAT_SIZE, UBOAT_GUNPOWER, "UBoat");
    return s;
}

UBOAT_SIZEUBOAT_GUNPOWDER 是类中的 private static final int 变量

Ship的构造函数是错误的

this.bezeichnung = name;

应该是

this.name = name;

编辑

好的,你现在已经改变了你的问题...

private final String NAME = "U-Boot";
private final int SIZE = 2;
private final int GUNPOWER = 1;

public Submarine(){
    super(SIZE,GUNPOWER,NAME);  //Here it gets underlined
}

SIZEGUNPOWDERNAME 都需要是 private static final ... 变量,因为您在构造函数时没有 Submarine 的实例——所以它们必须是 static

【讨论】:

    【解决方案2】:

    NAME 更改为static

    class Submarine extends Ship {
    
        private final static String NAME = "U-Boot";
        private final static int SIZE = 2;
        private final static int GUNPOWER = 1;
    
        public Submarine() {
            super(SIZE, GUNPOWER, NAME);
        }
    

    我认为您的构造函数名称问题是一个错字。

    【讨论】:

      【解决方案3】:

      你的潜艇构造器是错误的

      public UBoot(){
          super(SIZE,GUNPOWER,NAME);
      }
      

      必须

      public Submarine(){
          super(SIZE,GUNPOWER,NAME);
      }
      

      UPDATE 指出NAME 变量应该是static

      【讨论】:

      • 我注意到今天发生的情况,一些问题的答案会无缘无故地被随机投票。看起来有人在滥用系统。
      • 看起来很奇怪......似乎都是有效的问题
      【解决方案4】:

      有几个问题:

      没有UBoot 类但Submarine

      public UBoot(){
              super(SIZE,GUNPOWER,NAME);
      }
      

      应该是

      public Submarine(){
                  super(SIZE,GUNPOWER,NAME);
      }
      

      没有名为bezeichnung的字段。

      这个:

      this.bezeichnung = name;
      

      应该是:

      this.name = name;
      

      NAME 应该是 static 所以这个:

      private final String NAME = "U-Boot";
      

      应该是:

      private static final String NAME = "U-Boot";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多