Конструктор и методы получения и установки - PullRequest
0 голосов
/ 11 июля 2020

Я уже провел некоторое исследование об этом топе c (например, Разница между конструктором и геттером и сеттером ). Основная разница между методами получения и установки и конструктором для меня ясна. Я просто хочу создать простое окно входа в систему (без базы данных в фоновом режиме), но у меня есть некоторые проблемы с моими методами получения и установки.

Я создал класс с именем user и класс с именем admin. Класс user имеет конструктор, методы получения и установки:

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 ]

2 голосов
/ 11 июля 2020

Вы действительно можете это сделать, просто убедитесь, что ваши геттеры и сеттеры опубликованы c, простой способ убедиться, что ваши геттеры и сеттеры верны, - это щелкнуть правой кнопкой мыши в своем классе-> источник-> сгенерировать геттеры и сеттеры, а затем выбрать какие атрибуты вы хотите читать и записывать, однако, если вы намерены с этой строкой

    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 голос
/ 11 июля 2020

Во фрагментах кода отсутствует информация. Как выглядят ваши геттеры и сеттеры? Это частные методы или методы публикации c? Вы случайно поместили их как методы c stati?

Я бы не поместил код под ваш конструктор, не поместив его ни в конструктор, ни в какой-либо другой метод ... Я не знаю, почему вы хотите создать экземпляр унаследованного метода в вашем классе, но если вы действительно хотите, сделайте это следующим образом.

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

}

Я бы рекомендовал вам убедиться, что ваши геттеры и сеттеры - publi c, и вы должны создать logi c класс отделен от сущности и создайте там пользователя-администратора, например:

public class MyService{

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

Пожалуйста, будьте более ясны или укажите, чего вы хотите достичь, трудно понять, в чем проблема просто кусок кода, не слишком связанный с проблемой ...

0 голосов
/ 11 июля 2020

Это не совсем то, о чем вы спрашивали, но я хочу упомянуть пару проблем, которые, я думаю, вы захотите решить, прежде чем беспокоиться о том, как использовать admin.setUsername("admin1");.

При создании объекта Admin , вы создаете объект с 3 (тремя) наборами полей. Три имени пользователя, три пароля и т. Д. c. Вы этого не хотите. Вы захотите сократить до одного набора.

Как вы сейчас закодировали, Admin наследует один набор полей (переменных экземпляра) от User, суперкласса. Затем у него есть один набор полей, объявленных в классе Admin, на данный момент их два. Наконец, Admin содержит объект User с именем admin. Этот объект содержит третий набор полей (хотя и не инициализирован по причинам, объясненным в ответе Kntkat).

Я предлагаю вам обойтись полями в User и удалить те поля в Admin, которые повторяют поля с User. И я предлагаю вам не создавать объект User внутри класса Admin, поскольку Admin уже является User по наследству. Также удалите поле admin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...