我在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来建议解决方案。我不确定为什么它需要是静态的,有人可以向我解释一下吗?
答案 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());
这样,您可以在实例化对象的同时设置人员的详细信息。这是面向对象编程领域的良好编程实践。