我已经对此主题进行了一些研究(例如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");
。为什么会这样?
答案 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
字段。