ArrayList Java加法

ArrayList Java加法,java,collections,arraylist,Java,Collections,Arraylist,请帮我解释为什么我会得到以下代码的奇怪输出。。。。。 为什么getName的值为null 输出: 列表检查:空: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.p

请帮我解释为什么我会得到以下代码的奇怪输出。。。。。 为什么getName的值为null

输出:

列表检查:空: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;
}

}
局部变量、名称和类型被分配给电影构造函数中同名的全局变量名称。对象类型的默认值为null,因此这些变量保持未赋值状态。更正的构造函数应显示为

public Movie(String name, String genre) {
   this.name = name;
   this.genre = genre;
}
这是错误的:

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

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

就像在setters中一样。

您正在使用此名称分配参数。名称应该是另一种方式

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

您的构造函数是错误的,应该是错误的

public Movie(String name, String genre)
{
    this.name = name;
    this.genre = genre;
}
莱默斯说得对

this指的是类本身,因此this.genre指的是类变量genre


切换它们以解决问题。

当您写入name=this.name时,您将this.name的值分配给name。因此,在您的情况下,this.name在初始化时保持null,并且您正在将其分配给name

使用在bean中编写的getter和setter是一个很好的实践。
您可以将其设置为setNamename,而不是编写此项。name=name。但最终两者都会执行相同的操作。

请尝试使用this.name=name,而不是相反的方法。@adenoyelle否,除非您希望用对象中的空参数覆盖传递的参数。你知道名字阴影吗?如果这是个好习惯,我不喜欢。在执行此操作的代码中,您必须检查在哪里调用setter以及在哪里直接访问对象。这经常让我发疯。因此,在我看来,只从对象外部调用setter和getter是一种很好的做法。