Java 构造函数、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

我已经做了一些关于这个主题的研究(例如)。getter和setter方法与构造函数之间的主要区别对我来说很清楚。我只想创建一个简单的登录窗口(后台没有db),但是我的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”)。这是为什么?

代码片段缺少信息。你的接球手和二传手看起来怎么样?它们是私有方法还是公共方法?您是否意外地将它们作为静态方法

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

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());