Java 在子方法中创建新对象显然不会';I don’我不能通过推荐信
我目前正在从事一个java项目,该项目实现dijkstra算法。 我有一些类似的代码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
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的值