这是我的基础课:
@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()的调用必须是构造函数主体中的第一条语句。 如您所见,我没有构造函数,即使将其添加,也会遇到相同的错误。为什么会发生这种情况,我该如何避免呢?
答案 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 关键字的各种用法:
当派生类和基类具有相同的数据成员时,会发生这种情况。在这种情况下,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()。
有关更多信息,请阅读:super in java