-1

我有 4 个类:边缘、图形、节点和最短路径。我想在我的最短路径类的静态主目录中调用我的图形类中的方法。我得到的错误是“无法从类型图中对非静态方法 readFile() 进行静态引用”。我会很感激我卡住的任何帮助:(!

public class edge<E>{}
public class node<E> extends edge<E>{}

public class graph<E> {
   public node<E> BFS(E value)
   {
    if (adjList.isEmpty())
        return (null);

    ArrayList<node<E>> visitedNodes = new ArrayList<node<E>>(); 

    node<E> sourceNode = adjList.get(0);
    sourceNode.setVisited(true);

    visitedNodes.add(sourceNode); 

    node<E> currNode = null; 

    while(!visitedNodes.isEmpty())
    {
        currNode = visitedNodes.get(0);
        visitedNodes.remove(0);

        if(currNode.getData() == value)
            return (currNode);

        //ListIterator<edge<E>> itr = currNode.incidentEdges.listIterator(); 

        for(node<E> adjNode : adjList) 
        {
            adjNode = adjNode.getChild();

            if(!adjNode.isVisited())
            {
                adjNode.setVisited(true);
                visitedNodes.add(adjNode);
            }

        }

    }
    return (null);
}


public void readFile()
{
File file = new File("Enron-Email.txt");

try 
{
    Scanner scanner = new Scanner(file);

    while (scanner.hasNextLine()) 
    {
        String line = scanner.nextLine();
        if(line.trim().startsWith("#"))
        {
            continue; 
        }

        String[] tokens = line.split("\\t");

        Integer parent = Integer.parseInt(tokens[0]);
        Integer child = Integer.parseInt(tokens[1]);

        addEdge((E) parent, (E) child);
    }
    scanner.close();
} 
catch (FileNotFoundException e) 
{
    e.printStackTrace();
}
}
}    


    public class shortestpath{
public static void main(Integer source, Integer dest) {
    graph<E> myGraph = new graph<E>(); 
    myGraph.readFile();
    myGraph.BFS(source);    
}
}
4

3 回答 3

1

您要么必须在类上创建方法graph.readFile()static调用readFile()方法。instancegraph

在第一种情况下,它看起来像:

public class shortestpath {
    public static void main (String[] args) {
        graph.readFile ();
    }
}

public class graph {
    public static void readFile () {
    }
}

而在第二种情况下,它看起来像:

public class shortestpath {
    public static void main (String[] args) {
        new graph ().readFile ();
    }
}

public class graph {
    public void readFile () {
    }
}

此外,请注意,即使在下面的代码中我使用了小写的类名(正如您在问题中提供的那样),Java 世界中有一个通用约定使用大写驼峰式命名类。

于 2012-11-17T23:31:30.897 回答
0

要从静态方法调用非静态方法,您需要创建类的实例并在该实例上调用该方法。因此,在您的情况下,您需要创建Graph 类的实例并从ShortestPath 类的主要方法调用方法。readFile()

Graph<YourType> g = new Graph<YourType>(); //replace YourType with the type you want to pass like Integer, blah blah...
g.readFile();

编辑:

graph<E> myGraph = new graph<E>(); 

应该

graph<Integer> myGraph = new graph<Integer>(); //Or some other valid types. 

E is just an representation of Element. provide a valid element type
于 2012-11-17T23:32:15.717 回答
0

为了调用实例方法,您必须有一个可以调用它的对象。

public class A
{
    public void someMethod()
    {
        ....
    }
}

public class B
{
    public static void main(String[] args)
    {
        A.someMethod(); // ERROR

        A a = new A();
        a.someMethod(); // Correct
    }
}
于 2012-11-17T23:33:25.520 回答