我已经搜索过这个问题并找到了很多答案,但是我不理解它们,我会对我自己的代码做一个澄清,所以希望它会有意义
我试图在main方法中调用PrintList方法
但我收到此错误
无法对类型为Stack
的非静态方法PrintList()进行静态引用如果我将PrintList的修饰符更改为静态,则会破坏整个代码。
有人可以帮我解决这个问题吗?
由于
public class Stack<Item> {
public int N; // size of the stack
public Node<Item> first; // top of stack
public Node<Item> last; // top of stack
// helper linked list class
private static class Node<Item> {
private Item item;
private Node<Item> next;
}
public Stack() {
first = null;
last = null;
N = 0;
}
public void PrintList() {
Node<Item> current;
current = first;
while (current.next != null) {
System.out.println(current.item);
current = current.next;
}
}
public static void main(String[] args) {
// Declare the stack
Stack<String> s = new Stack<String>();
s.push("Bob");
s.push("Mary");
s.push("David");
s.InsertBegin("George");
System.out.println("First item: " + s.peek());
Object current;
PrintList(); // what is wrong here?
}
}
答案 0 :(得分:3)
问题是您没有指定要调用PrintList
的实例。要解决此问题,请更改此信息:
PrintList(); // what is wrong here?
到此:
s.PrintList();
答案 1 :(得分:3)
您真正需要的是准确理解static
和non-static
的确切含义。
首先,一些背景知识。如果其中一些已经为您所熟知,请道歉。 Java是一种object oriented语言,您可以创建class
作为特定类型对象的模板,定义它拥有的属性(变量),以及它的行为方式(方法)。这些属性和行为属于该类的对象:
public class Person {
private String forename;
private String surname;
public Person(String forename, String surname) {
this.forename = forename;
this.surname = surname;
}
public String getFullName() {
return forename + " " + surname;
}
public static void main(String[] args) {
Person john = new Person("John", "Doe");
}
}
上面的代码定义了一个模板,用于创建Person
类型的对象,每个对象都有forename
和surname
两种类型String
。它还定义了一种行为,允许您使用Person
方法获取getFullName()
的全名。
forename
和surname
以及getFullName()
都是non-static
字段/方法的示例。也就是说,它们属于特定的Person对象。重要的是:如果没有首先创建Person
对象,这些都不会存在。在这种情况下,我们有一个名为Person
的{{1}}对象,其john
为&#34; John&#34;和{#1}}&#34; Doe&#34;。如果我们要调用forename
&#39; surname
方法:
john
然后我们回到getFullName()
。
与此相反的是john.getFullName();
。静态事物不属于某个对象,而是属于"John Doe"
。
static
此处class
public class Person {
private String forename;
private String surname;
private static String species = "Homo sapiens";
public Person(String forename, String surname) {
this.forename = forename;
this.surname = surname;
}
public String getFullName() {
return forename + " " + surname;
}
public static void main(String[] args) {
Person john = new Person("John", "Doe");
}
}
不属于<{em}属于String
,属于species
。静态方法和变量不需要对象才能存在,它们始终存在。您可以使用john
本身作为参考来访问它,如下所示:
Person
在您的示例中,您已将方法class
定义为Person.species;
类对象的行为。问题是您在PrintList()
方法中,Stack<Item>
。这意味着您不在“上下文”中。当你试图调用{{1}时,一个对象(因为main
属于static
,不属于main
类型的对象) } 方法。当您使用Stack<Item>
方法时,为了调用Stack<Item>
方法或访问PrintList()
属性,必须使用引用 到拥有它的类的对象。在您的情况下,您已经以static
的形式获得此引用,因此您可以像这样调用non-static
方法:
non-static
注意:传统上在Java中我们使用camelCase作为方法名称,因此它应该是s
。
当我第一次开始学习Java时,我发现PrintList()
的概念非常难以理解 - 因为我还没有学会以面向对象的方式思考。当便士下降时,你会想知道为什么你会挣扎。希望这会帮助你更接近那个便士一刻!
*只要加载了类并且它不是编译时常量(但你不必担心这些)。
答案 2 :(得分:0)
你可以这样调用静态方法:
ClassName.methodToCall();
你可以这样调用非静态方法:
ClassName classInstance = new ClassName();
classInstance.methodToCall();
由于您的方法PrintList()
在这种情况下应该是非静态的,因此您应该在实例上调用它。