构造方法,getter和setter方法

时间:2020-07-11 11:57:00

标签: java object constructor getter-setter

我已经对此主题进行了一些研究(例如Difference between constructor and getter and setter)。 getter和setter方法与构造方法之间的主要区别对我来说很明显。我只想创建一个简单的登录窗口(后台无数据库),但我的getter和setter方法存在一些问题。

我创建了一个名为user的类和一个名为admin的类。 user类具有构造函数以及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

在另一个类中,我尝试创建一个新用户:

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");。为什么会这样?

3 个答案:

答案 0 :(得分:2)

您实际上可以做到这一点,只是确保您的getter和setter是公共的,一种确保您的getter和setter正确的简单方法是右键单击class-> source-> generate 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());

在这两种情况下,您实际上都不需要创建实例变量,因为它们是从用户类继承的。

答案 1 :(得分:1)

代码段缺少信息。您的吸气器和装夹器是什么样的?它们是私有方法还是公共方法?您是否意外地将它们作为静态方法?

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

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和setter是公共的,并且应该创建一个与实体分离的逻辑类,并在那里创建一个admin用户,例如。

public class MyService{

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

请更加清楚或指定您要实现的目标,很难知道问题出在哪儿,而只是与问题没有太大关系的一小段代码...

答案 2 :(得分:1)

这并不是您所要的,但是我想提一些我认为您在关心如何使用admin.setUsername("admin1");之前要解决的问题。

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

由于您目前已Admin进行编码,因此它会从超类User继承一组字段(实例变量)。然后,它在Admin类中声明了一组字段,到目前为止是两个。最后,Admin包含一个名为User的{​​{1}}对象。该对象包含第三组字段(尽管由于Kntkat的回答中所述原因而未初始化)。

我建议您使用admin中的字段,并删除User中那些重复Admin中的字段的字段。而且我建议您不要在User类内创建User对象,因为通过继承,Admin已经是Admin了。因此,也请删除User字段。