【问题标题】:Call to super() must be first statement message inside a method对 super() 的调用必须是方法内的第一条语句消息
【发布时间】:2019-03-09 11:16:12
【问题描述】:

这是我的基类:

@Service
public class BasicUserManagerService implements UserManager {
    @Autowired
    private UserRepository UserRepository;

    private Logger logger = LoggerFactory.getLogger(UserManagerPasswordController.class);

    @Override
    public void createUser(User User) {
        if (UserRepository.findByEmail(User.getEmail()) != null)
            throw new InvalidDataException("User already registered with this email address");
        UserRepository.save(User);
        logger.info("Created user: {}", User.getEmail());
    }
}

我正在尝试将此类扩展如下:

@Service
public class UserManagerService extends BasicUserManagerService implements UserManager {
    @Override
    public void createUser(User User) {
        super().createUser(User);
    }
}

但我不断收到错误,即对 super() 的调用必须是构造函数主体中的第一条语句。 如您所见,我没有构造函数,即使添加它,我也会收到相同的错误。为什么会发生这种情况,我该如何避免?

【问题讨论】:

标签: java spring-boot super


【解决方案1】:

更改此 super 用法。 super() 是父级的构造函数super 是对父类的引用。

@Service
public class UserManagerService extends BasicUserManagerService implements UserManager {
    @Override
    public void createUser(ProxyCircuitUser proxyCircuitUser) {
        super.createUser(proxyCircuitUser);
    }
}

【讨论】:

    【解决方案2】:

    super()是对父类构造函数的调用; 这根本不是你想要的。

    相反,您想调用createUser 方法的父类实现。 代码是:super.createUser(user)

    【讨论】:

      【解决方案3】:

      以下是 Super 关键字在 Java 中的各种用法:

      1. 在变量中使用 super

      当派生类和基类具有相同的数据成员时,就会出现这种情况。在这种情况下,JVM 可能会产生歧义。

      /* Base class vehicle */
      class Vehicle 
      { 
          int maxSpeed = 120; 
      } 
      
      /* sub class Car extending vehicle */
      class Car extends Vehicle 
      { 
          int maxSpeed = 180; 
      
          void display() 
          { 
              /* print maxSpeed of base class (vehicle) */
              System.out.println("Maximum Speed: " + super.maxSpeed); 
          } 
      } 
      
      /* Driver program to test */
      class Test 
      { 
          public static void main(String[] args) 
          { 
              Car small = new Car(); 
              small.display(); 
          } 
      } 
      

      输出:

      Maximum Speed: 120
      
      1. 在方法中使用 super

      当我们要调用父类方法时使用它。因此,只要父类和子类具有相同的命名方法,我们就使用 super 关键字来解决歧义。

      /* Base class Person */
      class Person 
      { 
          void message() 
          { 
              System.out.println("This is person class"); 
          } 
      } 
      
      /* Subclass Student */
      class Student extends Person 
      { 
          void message() 
          { 
              System.out.println("This is student class"); 
          } 
      
          // Note that display() is only in Student class 
          void display() 
          { 
              // will invoke or call current class message() method 
              message(); 
      
              // will invoke or call parent class message() method 
              super.message(); 
          } 
      } 
      
      /* Driver program to test */
      class Test 
      { 
          public static void main(String args[]) 
          { 
              Student s = new Student(); 
      
              // calling display() of Student 
              s.display(); 
          } 
      } 
      

      输出:

      This is student class
      This is person class
      
      1. 在构造函数中使用 super

      super 关键字也可以用来访问父类的构造函数。更重要的一点是,“super”可以根据情况调用参数构造函数和非参数构造函数。

      /* superclass Person */
      class Person 
      { 
          Person() 
          { 
              System.out.println("Person class Constructor"); 
          } 
      } 
      
      /* subclass Student extending the Person class */
      class Student extends Person 
      { 
          Student() 
          { 
              // invoke or call parent class constructor 
              super(); 
      
              System.out.println("Student class Constructor"); 
          } 
      } 
      
      /* Driver program to test*/
      class Test 
      { 
          public static void main(String[] args) 
          { 
              Student s = new Student(); 
          } 
      }
      

      输出:

      Person class Constructor
      Student class Constructor
      

      由于super()会调用父类的构造函数,所以它应该是子类构造函数中要执行的第一条语句。如果要调用父类的方法,请使用 super 而不是 super()

      更多信息请阅读:super in java

      【讨论】:

        猜你喜欢
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多