调用super()必须是方法中的第一条语句消息

时间:2018-10-04 06:26:33

标签: java spring-boot super

这是我的基础课:

@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()的调用必须是构造函数主体中的第一条语句。 如您所见,我没有构造函数,即使将其添加,也会遇到相同的错误。为什么会发生这种情况,我该如何避免呢?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

  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