2013-05-23 2 views
0

Пожалуйста, помогите мне, почему я получаю странный вывод для этого ниже кода ..... Почему я получаю null для getName().ArrayList Java Добавление

Выход:

Список Проверил: нуль: 1

public class ListTest 
{ 
public static void main(String args[]) 
{ 
    List<Movie> lst = new java.util.ArrayList<Movie>(); 
    lst.add(new Movie("move1", "genre1")); 
    System.out.println("List Check :" + lst.get(0).getName() + ":" 
        + lst.size()); 
} 
} 

class Movie 
{ 
private String name; 
private String genre; 

public Movie(String name, String genre) 
{ 
    name = this.name; 
    genre = this.genre; 
} 

public String getName() 
{ 
    return name; 
} 

public void setName(String name) 
{ 
    this.name = name; 
} 

public String getGenre() 
{ 
    return genre; 
} 

public void setGenre(String genre) 
{ 
    this.genre = genre; 
} 

} 
+0

Попробуйте 'this.name = name', а не наоборот. – devconsole

ответ

4

Это неправильно:

public Movie(String name, String genre) 
{ 
    name = this.name; 
    genre = this.genre; 
} 

должен быть

public Movie(String name, String genre) 
{ 
    this.name = name; 
    this.genre = genre; 
} 

как в сеттеров.

+0

Нет. Это было правильно, даже если более ясно с «this» –

+0

@adenoyelle no, за исключением того, что вы хотите перезаписать переданные параметры теми из объекта (которые являются пустыми). Вы знаете, как затенять имя? – Kai

+0

Я был уверен, но после попытки, вы правы, извините –

1

Локальные переменные, name и genre присваиваемые на глобальные имена переменных одного и того же имени в конструкторе Movie. Значение по умолчанию Object - это null, поэтому эти переменные остаются неназначенными. Скорректированная конструктор должен выглядеть как

public Movie(String name, String genre) { 
    this.name = name; 
    this.genre = genre; 
} 
1

Вы назначаете параметры с помощью this.name должно быть наоборот

public Movie(String name, String genre) 
{ 
    this.name = name; 
    this.genre = genre; 
} 
1

ваш конструктор не так, он должен быть

public Movie(String name, String genre) 
{ 
    this.name = name; 
    this.genre = genre; 
} 
0

Reimeus имеет это право.

«Это» относится к самому классу, поэтому «this.genre» относится к переменной класса «жанр».

Включите их, чтобы устранить проблему.

0

Когда вы пишете имя = this.name, вы назначаете значение this.name для имени. Таким образом, в вашем случае this.name имеет значение null при инициализации и присваивает ему имя.

Это хорошая практика использования геттеров и сеттеров, которые вы написали в своем bean-компоненте. вы можете установить его как setName(name) вместо того, чтобы писать this.name=name. Однако оба они выполняют одно и то же действие.

+0

Если это хорошая практика, мне это не нравится. В коде, где это делается, вы должны проверить, где вызывается сеттер, и где к объекту обращаются напрямую. Это регулярно меня злит. Поэтому, на мой взгляд, хорошей практикой является вызов сеттеров и геттеров только извне объекта. – Kai

Смежные вопросы