Java 构造函数、Getter和Setter方法
我已经做了一些关于这个主题的研究(例如)。getter和setter方法与构造函数之间的主要区别对我来说很清楚。我只想创建一个简单的登录窗口(后台没有db),但是我的getter和setter方法有一些问题 我创建了一个名为Java 构造函数、Getter和Setter方法,java,object,constructor,getter-setter,Java,Object,Constructor,Getter Setter,我已经做了一些关于这个主题的研究(例如)。getter和setter方法与构造函数之间的主要区别对我来说很清楚。我只想创建一个简单的登录窗口(后台没有db),但是我的getter和setter方法有一些问题 我创建了一个名为user的类和一个名为admin的类。user类具有构造函数、getter和setter方法: public class User { private String fName; private String nName; private S
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”)代码>。这是为什么?代码片段缺少信息。你的接球手和二传手看起来怎么样?它们是私有方法还是公共方法?您是否意外地将它们作为静态方法
如果不将代码放入构造函数或任何其他方法中,我不会将代码放在构造函数下面。。。
我不知道为什么要在类中创建继承方法的实例,但如果您真的想这样做,可以这样做
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...
}
}
请更清楚地说明或指定您想要实现的目标,很难知道仅仅一段与问题无关的代码有什么问题…您实际上可以这样做,只要确保您的getter和setter是公共的,确保getter和setter正确的一种简单方法是在类->源->生成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);
或者,如果希望这些值成为每次创建admin对象时的默认值,则可以在构造函数中执行此操作:
public Admin (){
super("admin","name","secondName",password,1);
然后
然后,您可以根据需要更改用户名,如果您想检查用户名是否已更改,请使用
System.out.println(admin.getUsername());
在这两种情况下,您都不需要创建实例变量,因为它们是从用户类继承的。这并不是您所要求的,但我想在考虑如何使用admin.setUsername(“admin1”)之前,先提一提几个问题,我认为您需要解决这些问题代码>
创建Admin
对象时,您正在创建一个包含3(三)组字段的对象。三个用户名,三个密码,等等,你不想要的。您将希望减少到一组
由于您当前已编写了Admin
,因此它从User
超类继承了一组字段(实例变量)。然后它在Admin
类中声明了一组字段,到目前为止只有两个字段。最后,Admin
包含一个名为Admin
的User
对象。该对象包含第三组字段(尽管由于Kntkat的回答中解释的原因而未初始化)
我建议您处理User
中的字段,并删除Admin
中重复User
中字段的字段。我建议您不要在Admin
类中创建User
对象,因为Admin
通过继承已经是User
。因此,也要删除admin
字段。现在请澄清,我不能使用例如admin.setUsername(“admin1”);。这是为什么?。请参阅并提供。作为提示–如果类a
扩展类B
,则类B
的实例可以访问a
的方法,只要其方法访问修饰符允许。。。我建议你参考许多关于继承/子类型的教程中的一个。我无法从你提供的信息中找出答案。通常,您应该能够调用admin.setUsername()代码>。(1) 你可以吗?(2) 尝试时会收到什么错误消息?(1)创建用户
并调用VARABLE管理员
,这让人感到困惑。您的意思是创建一个管理员?(2) 不要在子类中重复实例变量。关键是它们是从超类继承的,因此管理员已经拥有了它们。请澄清。有问题的setter不在您发布的代码中->我们无法检查该问题。(显而易见:如果你没有二传手,你就不能用它)。你的意思是好的——但是试图回答一个不清楚的问题是一场猜谜游戏。最好在问题的评论中要求澄清,等待OP提供更多细节,并澄清问题;)对不起,现在就看吧。很好。我会换的。谢谢
System.out.println(admin.getUsername());