2013-04-01 4 views
-2

Я написал код -Неожиданный выход в Java

// 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 

но когда программа возвращается к основной, значение узла устанавливается в нуль еще раз. Поэтому я получаю выход -

Node is null 
5 
c 
Node is null 

Пожалуйста, помогите мне изменить код, чтобы получить желаемый результат. Любая помощь будет оценена!

+0

Взгляните на [это-Java-передача по ссылке] (HTTP: //stackoverflow.com/questions/40480/is-java-pass-by-reference?rq=1) – Pshemo

ответ

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 
0

Вы передаете статический объект, а в функции() метод, вы не изменяете значение объекта узла. Вы меняете только значение другого объекта. Таким образом, в основном значение узел s null только.

0

В общем, это связано с тем, что Java передает копию ссылки на объект aNode на ваш метод. Изменение этой ссылки не изменит исходную ссылку.

3

Вы должны знать, что aNode node и aNode x являются ссылками на разные объекты. Это одна из особенностей Java - передача только по значению. Это значит, что, когда вы звоните

function(node); 

вы не передавая node ссылки на метод function(...), вы создаете новую ссылку на тот же объект. Но в соответствии

x = new aNode(5,'c'); 

вы устанавливаете ссылку x на новый объект. Итак, nodeеще ссылки на нуль и x ссылки на новые aNode.

Чтобы узнать больше о параметрах прохождения в Java, read next article.

Параметры ссылочных типов данных, такие как объекты, также передаются по методу по значению. Это означает, что при возврате метода ссылка на ссылается на тот же объект, что и раньше. Однако значения полей объекта могут быть изменены в методе , если они имеют надлежащий уровень доступа.

+0

, что помогло! Теперь я использовал оператор return в функциях, которые превышают значение в main и фиксируются. Спасибо за помощь :) – shivamtiwari93

+0

@ shivamtiwari93, добро пожаловать – bsiamionau

0

Внутренняя функция(), x - это просто локальная переменная. Когда вы переназначаете ссылку в Java, вы изменяете содержимое самой ссылки, а не ссылку на объект. В Java нет способа передать адрес объекта. Если вы хотите такого поведения, вы можете попробовать с общим классом, например, Wrapper

Смежные вопросы