我写了一段代码 -
// Node Class
class aNode {
// Node Contents
int NodeInt;
char NodeChar;
// constructor
aNode() {
}
aNode(int x, char y) {
NodeInt = x;
NodeChar = y;
}
}
class MainClass {
static aNode node = new aNode();
public static void main(String[] args) {
node = null;
function(node);
if (node == null) {
System.out.println("Node is null");
}
}
static void function(aNode x) {
if (x == null) {
System.out.println("Node is null");
}
x = new aNode(5, 'c');
System.out.println(x.NodeInt);
System.out.println(x.NodeChar);
}
}
我希望输出为 -
Node is null
5
c
但是当程序返回main时,node的值再次设置为null。所以我得到输出 -
Node is null
5
c
Node is null
请帮我修改代码以获得所需的输出。任何帮助将不胜感激!
答案 0 :(得分:3)
您应该知道,aNode node
和aNode x
是对不同对象的引用。它是Java功能之一 - 按值传递 。这意味着,当你打电话时
function(node);
您没有将node
引用传递给方法function(...)
,而是要创建对同一对象的新引用。但是在行
x = new aNode(5,'c');
您正在为新对象设置引用x
。因此,node
仍然引用了对新x
的null和aNode
引用。
要了解有关在Java中传递params的更多信息,请read next article。
也会传入参考数据类型参数,例如对象 方法的价值。这意味着当方法返回时, 传入引用仍引用与以前相同的对象。 但是,可以在中更改对象字段的值 方法,如果他们有适当的访问级别。
答案 1 :(得分:0)
您正在传递静态对象,但在方法function()中,您没有更改对象 节点 的值。您只是更改其他对象的值。所以在main中, node 的值仅为null。
答案 2 :(得分:0)
通常,这是因为Java将对aNode对象的引用副本传递给您的方法。更改此引用不会更改原始引用。
答案 3 :(得分:0)
在函数()中,x只是一个局部变量。在Java中重新分配引用时,您正在修改引用本身的内容,而不是引用的引用内容。 Java中没有办法传递对象的地址。如果您想要这样的行为,可以尝试使用Wrapper等通用类
答案 4 :(得分:0)
Java中不可能实现真正的传递。 Java按值传递所有内容,包括引用。。 因此,您必须稍微更改代码才能获得所需的输出:
class aNode{
//Node Contents
int NodeInt;
char NodeChar;
//constructor
aNode(){
}
aNode(int x, char y){
NodeInt = x;
NodeChar = y;
}
}
class JavaApplication8{
static aNode node = new aNode();
public static void main(String[] args){
node = null;
node=function(node);
if(node == null){
System.out.println("Node is null");
}
}
static aNode function(aNode x){
if(x == null)
{
System.out.println("Node is null");
}
x = new aNode(5,'c');
System.out.println(x.NodeInt);
System.out.println(x.NodeChar);
return x;
}
}
<强>输出:强>
Node is null
5
c