无法对非静态方法进行静态引用

时间:2014-05-25 22:43:50

标签: java

我已经搜索过这个问题并找到了很多答案,但是我不理解它们,我会对我自己的代码做一个澄清,所以希望它会有意义

我试图在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?
    }

}

3 个答案:

答案 0 :(得分:3)

问题是您没有指定要调用PrintList的实例。要解决此问题,请更改此信息:

        PrintList(); // what is wrong here?

到此:

        s.PrintList();

答案 1 :(得分:3)

您真正需要的是准确理解staticnon-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类型的对象,每个对象都有forenamesurname两种类型String。它还定义了一种行为,允许您使用Person方法获取getFullName()的全名。

forenamesurname以及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()在这种情况下应该是非静态的,因此您应该在实例上调用它。