2014-11-11 2 views
-2

У меня есть этот код:родительский конструктор принимает родительский объект в качестве параметра

public class Parent 
{ 
    int num; 
    Parent p; 

    Parent() 
    { 

    } 

    Parent(Parent s) 
    { 
     p=s; 
    } 

    void Print() 
    { 
     System.out.println(p.num); 
    } 

} 

и:

public class Child 
{ 

    public static void main(String args[]) 
    { 
     Parent p1=new Parent(); 
     Parent p2=new Parent(p1); 
     Parent p3=new Parent(p2); 
     p2.num=5;//line 1 
     p2.Print();//Line 2  
    } 
} 

O/р = 0. Это верно, когда я заменяю линии 1 и 2 с p3.num=5 и p3.Print() соответственно. Но когда я заменяю его p1.num=5 и p1.Print(), я получаю Runtime error (NullPointerException). Может ли кто-нибудь объяснить это поведение?

+0

Поскольку ваш конструктор по умолчанию ничего не делает полезным для 'Parent p1 = new Parent();'. По крайней мере, инициализируйте ваш 'int num' до 0 или что-то внутри вашего конструктора по умолчанию Parent(). – ha9u63ar

ответ

1

Это очень странный класс. Метод экземпляра Print печатает num, связанный с p, переданным в конструктор. У вас есть два конструктора, один из которых никогда не установлен p, что означает, что p будет null, если вы используете этот конструктор; ваш другой конструктор помнит Parent, который вы дадите ему, назначив его p.

Итак:

  • Вызов p1.Print() потерпит неудачу, потому что p1 «s p является null, поэтому пытаются использовать p.num выбрасывает NPE.

  • Вызов p2.Print() покажет p1 «s num, который 0, потому что вы никогда не ставили его к чему-либо значение по умолчанию для элементов данных является„все нули“значение, так 0 для int.

  • Вызов p3.Print() покажет p2 «s num, который (в исходном коде) будет 5, потому что это то, что вы установите его перед вызовом p3.Print().

Поэтому я говорю, что это очень странно, класс, что экземпляры имеют элемент в num данных, но Print не печатает ихnum, он печатает num в Parent прошло (если таковые имеются).

+1

Спасибо, очень много. @ T.J.Crowder.Это было очень полезно. Мои вопросы были одинаковыми. Я мог понять, что p.print() бросает исключение NullPointerException. Но не удалось проследить, почему num равно 0 и где будет стоить значение num = 5? Этот ваш ответ решил мой запрос. – Gpar

2

p1 создается с помощью конструктора без параметров, который не инициализирует элемент p. Поэтому при вызове Print в этом случае вы вызываете NullPointerException при попытке получить доступ к элементу num для нулевой ссылки - p.num.

BTW, класс Child совершенно бесполезен в этом примере. Он не расширяет класс Parent, и вы все равно не создаете его. Тот же код будет вести себя одинаково, если вы переместили метод main в класс Parent.

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