首页 > 解决方案 > 在第二个 java 文件上使用 import 不允许访问其变量

问题描述

我正在尝试从名为 Prim.java 的主文件中的 Graph.java 中的第二个名为 Graph 的类中访问一个变量。

我尝试过 Graph.variable,并尝试这样做:

import Graph;

但这会收到一条错误消息“预期”。

这是 Prim.java

import java.io.BufferedReader;
import java.io.File;  // Import the File class
import java.io.FileNotFoundException;  // Import this class to handle errors
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Prim{
    
    int min(boolean [] mst, int [] weights){
            int minweights = Integer.MAX_VALUE;
            int vert = -1;
            
            for (int i = 0; i <Graph.v ; i++) { // here is the issue
                if(mst[i]==false && minweights>weights[i]){
                    minweights = weights[i];
                    vert = i;
                }
            }
            
            return vert;
            
    }

当然,该文件还有更多内容,因此如果需要整个文件,我很乐意发布。

这是整个 Graph.java:

import java.io.BufferedReader;
import java.io.File;  // Import the File class
import java.io.FileNotFoundException;  // Import this class to handle errors
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Graph{
    

    public static class xGraph{
        public int v;
        public int m[][];

        public xGraph(int vert) {
            this.v = vert;
            m = new int[vert][vert];
        }

        public void edges(String start, String end, int weight) {   
            System.out.print("(" + start + ", " + end + ", " + weight + ") ");
            int numStart = convertToNum(start);
            int numEnd = convertToNum(end);
            m[numStart][numEnd]=weight;            
            m[numStart][numEnd] = weight;
            
        }
        
        
        public static int convertToNum(String s) {
            char ss = s.charAt(0);
            int num = 0;
            for (char a = 'a'; a <= 'z'; a++) {
                if (a == ss) {
                    
                    num = (a-'a');
                    
                }
            }
            
            return num;
        }
        
    }
    
}

这应该如何实现?非常感谢。

标签: javafileclassimport

解决方案


在以下情况下,您不必导入 Graph:
- 两个类都在默认包中。
- 两个类都在同一个包中。
此外,在 Prime 类中使用它之前,您必须像这样初始化静态内部类:

Graph.xGraph xgrph = new Graph.xGraph(10);
for (int i = 0; i <xgrph.v ; i++) { 
     //code
}

注意,这里的 xGraph 是一个静态内部类,但它是字段v并且m[][]不是静态的。所以你需要内部类的实例来访问这些字段。
如果您有不同版本的图表,例如xGraph, yGraph, specialGraph, 那么您可以使用继承:

public class Test
{

    public static void main(String[] args) throws Exception
    {
        Graph grph = new xGraph(10);
        for (int i = 0; i <grph.getV() ; i++) { 
           //code
        }
    }
}

interface  Graph{

    public int getV();
    public int[][] getM();
    public void edges(String start, String end, int weight);
    
    //helper methods
    public static int convertToNum(String s) {
        char ss = s.charAt(0);
        int num = 0;
        for (char a = 'a'; a <= 'z'; a++) {
            if (a == ss) {
                num = (a-'a');
            }
        }
        return num;
    }
}

class xGraph implements Graph {
    private  int v;
    private int m[][];

    public xGraph(int vert) {
        this.v = vert;
        m = new int[vert][vert];
    }

    
    @Override
    public void edges(String start, String end, int weight) {
        System.out.print("(" + start + ", " + end + ", " + weight + ") ");
        int numStart = Graph.convertToNum(start);
        int numEnd = Graph.convertToNum(end);
        m[numStart][numEnd]=weight;            
        m[numStart][numEnd] = weight;
    }


    @Override
    public int getV() {
        return this.v;
    }


    @Override
    public int[][] getM() {
        return this.m;
    }
}

推荐阅读