繁体   English   中英

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

[英]Call to super() must be first statement message inside a method

这是我的基类:

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

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

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

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

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

以下是Java中Super Keyword的各种用法:

  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()

有关更多信息,请阅读: java中的super

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM