Android 对非静态方法的静态引用

Android 对非静态方法的静态引用,android,eclipse,Android,Eclipse,我在Eclipse上遇到以下错误:无法从Person类型对非静态方法setName(String)进行静态引用。 我正在尝试创建一个名为Persons的类,我会将每个人的个人详细信息放入其中。下面是代码的摘录: public class Person { private String name; public String getName() { return name; } public void setN

我在Eclipse上遇到以下错误:
无法从Person类型对非静态方法setName(String)进行静态引用。

我正在尝试创建一个名为Persons的类,我会将每个人的个人详细信息放入其中。下面是代码的摘录:

public class Person {

    private String name;

        public String getName() {
            return name;
        }


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

}
现在在MainActivity.java中,我创建了一个名为setDetails的方法来设置人名

public void setDetails() {
    Person.setName("Simon");
}

Eclipse建议通过将Person类中的setName方法修饰符更改为static来提供解决方案。我不知道为什么它需要是静态的,有人能给我解释一下吗?

它需要是静态的,因为您正在访问整个类,而不是它的实例。要么将变量设为静态变量,要么创建person的实例,然后仅对该实例调用您的方法。您可以这样做:

public void setDetails() {
Person person = new Person();
    person.setName("Simon");
}
如果要有多个名称,则需要一个ArrayList….

Person是一个类。类就像蓝图或DNA链。你可以拥有一个蓝图,而不需要用它建造一座建筑,你也可以拥有DNA,而不需要由它控制的生物体。建筑和有机体都是实例:由蓝图构成。在Java和许多其他语言中,这些实例称为对象

对象的某些属性对于对象本身是唯一的(也称为非静态)。person(person对象)有名称,但名称因对象而异。您以这种方式编写了getName()函数(这是正确的)。要调用非静态函数,首先必须实例化对象,然后调用该对象上的方法。例如:

Person grandma = Person();
grandma.setName('Sally');
System.out.println(grandma.getName());
Person对象的某些属性在Person blueprint的所有对象中都是相同的。这些都是静态方法。静态函数不能访问非静态方法,除非这些方法与实例化对象关联。这是有意义的,因为蓝图无法知道从它创建的所有Person对象的名称。你问一个人的名字,而不是创造所有人的蓝图。您可以使用类名访问静态方法。比如说,

Person.getSpecies();
我不确定MainActivity.java包含什么,但听起来setDetails()功能应该在构造函数中完成,而不是在主类的函数中完成。构造函数是创建类或蓝图实例化的工具。您可以向构造函数发送某些属性,例如人名。因此,我建议您将setDetails()函数移到Person类中。您的新构造函数将如下所示:

public Person(String name){
    this.name = name
} 
Person grandma = Person('Sally');
System.out.println(grandma.getName());
有了构造器,我上面提供的示例现在如下所示:

public Person(String name){
    this.name = name
} 
Person grandma = Person('Sally');
System.out.println(grandma.getName());

这样,您可以在实例化对象的同时设置人员的详细信息。这是面向对象编程领域的良好编程实践。

您需要创建
Person
的实例。我建议你通读一篇教程:谢谢!这是正确的答案,我刚刚意识到我将setName方法应用于类,而不是类的对象。如果它是类的对象,则不必是静态的。仅当我们将该方法引用到类时,该方法才需要是静态的。为我糟糕的语法道歉。我手机上的自动纠错功能太差了。