非静态方法不能从**静态上下文**中引用。什么是静态内容?

时间:2016-11-04 07:31:10

标签: java static-methods

我正在编写一个程序来从文本文件中获取输入(仅包含整数),将其放入链接列表并显示链接列表。这是我的代码:

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

class Node{
    int value;
    Node next;
    Node(){
        next = null;
    }
}


public class ReverseLL{
    public static void main(String[] args) throws FileNotFoundException{
        Scanner in = new Scanner(new File("input.txt"));
        Node head = null;
        Node tail = null;
        while(in.hasNextInt()){
            Node ptr = new Node();
            ptr.value = in.nextInt();
            if(head == null){
                head = ptr;
                tail = ptr;
            }else{
                tail.next = ptr;
            }
            tail = ptr;
        }
        display(head);
        in.close();
    }

    static void display(Node head){
        while(head!=null){
            System.out.print(head.value + " " + "\n");
            head = head.next;
        }
    }

}

我将显示方法更改为静态后,现在可以正常工作了。然而在我改为静态之前。错误表示非静态方法显示(Node)无法从**静态上下文中引用我读了一些关于静态和非静态的文档。要调用非静态,我需要实例化一个实例,然后像instance.method一样调用。要调用静态方法,可以调用“class.method”。我的问题是基于我的计划。我没有在其他类中创建方法,为什么我需要更改为静态方法?什么是所谓的静态内容?谢谢你向我解释。

5 个答案:

答案 0 :(得分:2)

你的main方法是静态上下文,你试图从中调用非静态方法display()。即使它属于同一类,这也不起作用。要使disply方法非静态,你必须这样做。

public static void main(String[] args) throws FileNotFoundException{
    ReverseLL r = new ReverseLL();
    r.display(head);

}

public void display(Node head){
    ...
}

答案 1 :(得分:1)

调用的静态上下文:

Class_Name.method_name();

非静态调用上下文:

Class_Name object_name = new Class_Name();
object_name.method_name();

您不应该使用静态上下文调用非静态方法,反之亦然。

答案 2 :(得分:0)

简单地说,“静态”方法存在于类级别,而“非静态”方法存在于实例级别。在psvm方法中没有类的实例,从那里可以调用非静态方法。所以这种方法根本不存在。

您可以在这篇文章中阅读更多内容: relative paths instead of absolute ones

答案 3 :(得分:0)

您正在使用display方法调用public static void main(String[] args)方法。

要解决必须使用静态方法的问题:

public class ReverseLL{

    public void run() throws FileNotFoundException{
        Scanner in = new Scanner(new File("input.txt"));
        Node head = null;
        Node tail = null;
        while(in.hasNextInt()){
            Node ptr = new Node();
            ptr.value = in.nextInt();
            if(head == null){
                head = ptr;
                tail = ptr;
            }else{
                tail.next = ptr;
            }
            tail = ptr;
        }
        display(head);
        in.close();
    }

    void display(Node head){
        while(head!=null){
            System.out.print(head.value + " " + "\n");
            head = head.next;
        }
    }

    public static void main(String[] args){
        ReverseLL reverseLL = new ReverseLL();
        try{
            reverseLL.run();
        }catch(FileNotFoundException e){
            // handle ex...
        }       
    }
}

答案 4 :(得分:0)

你也可以使用新的ReverseLL()。dislpay(head);它会根除问题。