[英]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的各种用法:
当派生类和基类具有相同的数据成员时,会发生这种情况。 在这种情况下,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
当我们要调用父类方法时使用。 因此,每当父类和子类具有相同的命名方法时,为了解决歧义,我们将使用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
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.