构造函数和 Getter- 和 Setter 方法

Constructor and Getter- and Setter Methods

我已经对这个话题做了一些研究(例如 )。 getter- 和 setter- 方法和构造函数之间的主要区别对我来说很清楚。我只想创建一个简单的登录 window(后台没有数据库)但是我的 getter 和 setter 方法有一些问题。

我创建了一个名为 user 的 class 和一个名为 admin 的 class。 user class 有一个构造函数和 getter 和 setter 方法:

public class User {
    
    private String fName;
    private String nName;
    private String password;
    private String username;
    private int group;

    //Constructor
    public User(String username, String fName, String nName, String password, int group){

        this.username = username;
        this.fName = fName;
        this.nName = nName;
        this.password = password;
        this.group = group;
    }

//getter and setter methods here

在另一个 class 我试图创建一个新用户:

public class Admin extends User{

    private String username = "admin";
    private String fName = "name";
    private String nName = "secondName";
    private String password = "password";
    private int group = 1;

    public Admin(String username, String fName, String nName, String password, int group){
        super(username, fName, nName, password, group);
    }

    User admin = new User(username, fName, nName, password, 1);

}

现在我不能使用例如admin.setUsername("admin1");。这是为什么?

代码片段缺少信息。你的 getter 和 setter 长什么样?它们是私有方法还是 public 方法?你是不是不小心把它们当成静态方法了?

如果不将代码放入构造函数或任何其他方法中,我不会将代码放在构造函数下面... 我不知道你为什么要在 class 中创建继承方法的实例,但如果你真的想这样做,就这样做。

public class Admin extends User{

private String username = "admin";
private String fName = "name";
private String nName = "secondName";
private String password = "password";
private int group = 1;
private User admin = new User(username, fName, nName, password, 1);

public Admin(String username, String fName, String nName, String password, int group){
    super(username, fName, nName, password, group);
}

}

我建议您确保您的 getter 和设置器是 public,并且您应该创建一个与实体分离的逻辑 class 并在那里创建一个管理员用户,例如.:

public class MyService{

     public void setSomeStuffForAdmin(){
         Admin admin = new Admin();
         admin.setUsername("admin1");
         // Further logic here...
     }
}

请更清楚或具体说明您要实现的目标,仅靠一大块与问题无关的代码很难知道问题是什么...

你实际上可以做到这一点,只要确保你的 getter 和 setter 是 public,确保你的 getter 和 setter 正确的一个简单方法是右键单击你的 class->source- > 生成 getter 和 setter 然后选择你想要读取和写入的属性, 但是,如果您的意图 用这条线

    User admin = new User(username, fName, nName, password, 1);

是创建一个具有这些属性的新管理员

username = "admin";
fName = "name";
nName = "secondName";
password = "password";
group = 1;

也许可以试试:

要么直接将值传递给构造函数而不使用变量

      User admin = new User ("admin","name","secondName",password,1);

或者如果您希望这些成为管理对象每次创建时都具有的默认值,那么您可以在构造函数中执行此操作:

     public Admin (){
        super("admin","name","secondName",password,1);

然后

    Admin admin = new admin();

然后您可以根据需要更改用户名,如果您想检查它是否已更改,请使用

    System.out.println(admin.getUsername());

在这两种情况下,您实际上不需要创建实例变量,因为它们是从用户 class.

继承的

这不完全是你问的,但我想提几个我认为你在关心如何使用之前需要解决的问题 admin.setUsername("admin1");

创建 Admin 对象时,您正在创建一个具有 3(三)组字段的对象。三个用户名、三个密码,等等。你不希望这样。你会想要减少到一套。

正如您当前编码的那样,Admin 它从 User、超级 class 继承了一组字段(实例变量)。然后它在 Admin class 中声明了一组字段,到目前为止是两个。最后 Admin 包含一个名为 adminUser 对象。该对象包含第三组字段(尽管由于 Kntkat 的回答中解释的原因未初始化)。

我建议您凑合使用 User 中的字段并删除 Admin 中那些重复 User 中的字段的字段。我建议您不要在 Admin class 中创建 User 对象,因为 Admin 通过继承已经是 User。所以还要删除admin字段。