构造函数和 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
包含一个名为 admin
的 User
对象。该对象包含第三组字段(尽管由于 Kntkat 的回答中解释的原因未初始化)。
我建议您凑合使用 User
中的字段并删除 Admin
中那些重复 User
中的字段的字段。我建议您不要在 Admin
class 中创建 User
对象,因为 Admin
通过继承已经是 User
。所以还要删除admin
字段。
我已经对这个话题做了一些研究(例如
我创建了一个名为 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
包含一个名为 admin
的 User
对象。该对象包含第三组字段(尽管由于 Kntkat 的回答中解释的原因未初始化)。
我建议您凑合使用 User
中的字段并删除 Admin
中那些重复 User
中的字段的字段。我建议您不要在 Admin
class 中创建 User
对象,因为 Admin
通过继承已经是 User
。所以还要删除admin
字段。