静态引用非静态方法

时间:2014-03-28 18:39:56

标签: android eclipse

我在Eclipse上遇到以下错误:Cannot make a static reference to the non-static method setName(String) from the type Person.

我正在尝试创建一个名为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来建议解决方案。我不确定为什么它需要是静态的,有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:2)

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

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

如果您要拥有多个名称,那么您需要一个ArrayList ....

答案 1 :(得分:0)

Person是。类似蓝图或类似DNA链。你可以拥有一个没有由它制造的建筑物的蓝图,你可以拥有没有由它控制的生物体的DNA。建筑物和有机体是实例:由蓝图制成。在Java和许多其他语言中,这些实例称为对象

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

Person grandma = Person();
grandma.setName('Sally');
System.out.println(grandma.getName());

Person对象的某些属性在Person蓝图的所有对象中都是相同的。这些是静态方法。静态函数不能访问非静态方法,除非这些方法与实例化对象相关联。这是有道理的,因为蓝图无法知道从中创建的所有Person对象的名称。你问一个人他或她的名字,而不是创造所有人的蓝图。您可以使用类名访问静态方法。例如,

Person.getSpecies();

我不确定您的MainActivity.java包含什么,但听起来像setDetails()功能应该在构造函数中完成,而不是在主类中的函数中完成。构造函数是创建类或蓝图实例的原因。您可以将某些属性发送给构造函数,例如人名。所以,我建议你将setDetails()函数移动到Person类中。你的新构造函数看起来像这样:

public Person(String name){
    this.name = name
} 

使用构造函数,我上面提供的示例现在看起来像这样:

Person grandma = Person('Sally');
System.out.println(grandma.getName());

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