Java 在子方法中创建新对象显然不会';I don’我不能通过推荐信

Java 在子方法中创建新对象显然不会';I don’我不能通过推荐信,java,reference,new-operator,Java,Reference,New Operator,我目前正在从事一个java项目,该项目实现dijkstra算法。 我有一些类似的代码 public static void main(String[] args){ Graph myGraph = null; execute(myGraph); } private static void execute(Graph graph){ while(!quit){ doCommand(graph); }} d

我目前正在从事一个java项目,该项目实现dijkstra算法。 我有一些类似的代码

    public static void main(String[] args){
      Graph myGraph = null;
      execute(myGraph);
    }

    private static void execute(Graph graph){
      while(!quit){
      doCommand(graph);
    }}


    doCommand(Graph graph){
      if(command == n){
        graph = new Graph(size); }}
在我的程序中,我可以输入一些命令,例如n5,这意味着程序应该创建一个包含5个节点的新图形。 现在我的问题是,在输入例如n5之后,它仍然是空的。 在我看来,myGraph应该在n命令之后接收一个新的引用,但显然没有,我也不明白为什么。
顺便说一句,graoh线=新图形(大小);他肯定被处决了。这不是错误。

Java不允许重置引用,因为它是按值传递的。这意味着引用也是按值传递的。当您执行
graph=newgraph(size)
时,您所做的只是将本地引用(它是从
main
传入的引用的副本)指向
graph
的新实例<代码>图形内部
main
仍为
null


解决方法可能是让
docomand
返回
Graph
的实例,或者使用
Graph
的静态实例(因为所有方法似乎都是静态方法)。另一个选项是将
graph
封装在其他一些类中作为属性,这意味着该类中的所有方法都可以访问它。

Java不允许重新放置引用,因为它是按值传递的。这意味着引用也是按值传递的。当您执行
graph=newgraph(size)
时,您所做的只是将本地引用(它是从
main
传入的引用的副本)指向
graph
的新实例<代码>图形内部
main
仍为
null


解决方法可能是让
docomand
返回
Graph
的实例,或者使用
Graph
的静态实例(因为所有方法似乎都是静态方法)。另一种选择是将
graph
封装在另一个类中作为属性,这意味着该类中的所有方法都可以访问它。

这里的别名可能会混淆

将对象传递给方法将创建一个新别名(引用同一对象的另一个名称)。当对象的状态发生更改时,这将反映在所有别名中

分配给变量会中断别名。排队后

graph = new Graph(size);
变量图指向新对象,而不是最初指定的对象。
此更改是变量的局部更改,并会中断别名。因此,graph不再引用与myGraph相同的对象。

这里的别名可能会令人困惑

将对象传递给方法将创建一个新别名(引用同一对象的另一个名称)。当对象的状态发生更改时,这将反映在所有别名中

分配给变量会中断别名。排队后

graph = new Graph(size);
变量图指向新对象,而不是最初指定的对象。
此更改是变量的局部更改,并会中断别名。因此,graph不再引用与myGraph相同的对象。

在您的方法
docomand
中,您仅将新的graph对象分配给本地引用
graph
,但由于它是该方法的本地对象,因此此更改不会影响主
myGraph
引用,它根据以下情况始终保持为空:

Graph myGraph = null;

在您的方法
docomand
中,您仅将新的图形对象分配给本地引用
graph
,但由于它是该方法的本地对象,因此此更改对主
myGraph
引用没有影响,根据以下情况,主
myGraph
引用始终保持为空:

Graph myGraph = null;

你需要花一些时间学习基本的程序逻辑。main()在调用execute()之前将graph设置为null——当然,当该方法开始执行时,它是null,它不可能是其他任何东西


如果要使用在命令行中输入的数字,必须将其投入使用。例如,如果输入“5”,它将在args[0]中显示为字符串。如果你想做那么多次的事情,你必须把它转换成一个整数(在确认字符串代表一个之后!),然后把这个值放在某个(大概)整数变量中使用。

你需要花一些时间研究基本的过程逻辑。main()在调用execute()之前将graph设置为null——当然,当该方法开始执行时,它是null,它不可能是其他任何东西

如果要使用在命令行中输入的数字,必须将其投入使用。例如,如果输入“5”,它将在args[0]中显示为字符串。如果你想做那么多次的事情,你必须把它转换成一个整数(在确认字符串代表一个之后!),然后把这个值放在某个整数变量中使用。

试试这段代码

public static void main(String[] args){
    Graph myGraph = new Graph();
    doCommand(myGraph);
    System.out.println(myGraph);
}
private static void doCommand(Graph myGraph){
    myGraph = new Graph();
    System.out.println(myGraph);
}
您会注意到,这两个System.out.println语句都将打印不同的对象引用

这是因为当您调用doCommand方法并传递myGraph引用的值,然后在doCommand方法中创建一个新的对象图()时,局部变量myGraph(在doCommand内)将指向一个新对象,但这不会更改main()中myGraph的值

但是,如果您这样做:

public static void main(String[] args){
    Graph myGraph = new Graph();
    myGraph = doCommand(myGraph);
    System.out.println(myGraph);
}
private static Graph doCommand(Graph myGraph){
    myGraph = new Graph();
    System.out.println(myGraph);
    return myGraph;
}
两个println语句都将打印相同的对象引用。这是因为您正在将doCommand中myGraph的引用值返回到main中的myGraph。

试试这段代码

public static void main(String[] args){
    Graph myGraph = new Graph();
    doCommand(myGraph);
    System.out.println(myGraph);
}
private static void doCommand(Graph myGraph){
    myGraph = new Graph();
    System.out.println(myGraph);
}
您会注意到,这两个System.out.println语句都将打印不同的对象引用

这是因为当您调用doCommand方法并传递myGraph引用的值,然后在doCommand方法中创建一个新的对象图()时,局部变量myGraph(doCommand内部)将指向一个新对象,但这不会更改myGraph的值