2015-09-15 4 views
0

Я изучаю Java и недавно перешел к учебному курсу «Копировать конструктор». Я попытался написать код Copy Constructor, но он дает неожиданный результат.Java Copy Constructor работает не так, как ожидалось

Вопрос:

Почему первый выход показывает 0 и null значения?

Вот объект с копией конструктора:

class student6 { 

    int id; 
    String name; 
    int i; 
    String n; 

    student6(int a, String b) { 
     id = a; 
     name = b; 
    } 

    student6(student6 s) { 
     i = s.id; 
     n = s.name; 
    } 

    void display() { 
     System.out.println(i + "..." + n); 
    } 

    public static void main(String args[]) { 
     student6 s1 = new student6(11, "Suresh"); 
     student6 s2 = new student6(s1); 

     s1.display(); 
     s2.display(); 
    } 
} 

Выход

0...null

11...Suresh

+4

Почему вы имеете 'i' и' n' поля на всех? Что вы ожидали от них? –

+0

FYI, в Java нет «конструктора копирования».В C++ конструктор копирования имеет определенную сигнатуру arg, которая признана компилятором специальной. Компилятор испускает _implicit_ вызовы в конструктор копирования в определенных ситуациях (например, при передаче объекта в функцию по значению) В Java ничего подобного не происходит, потому что переменная Java никогда не может содержать объект: 'Foo a;' всегда является _reference_ к объекту, где бы вы его ни увидели. Созданный вами конструктор может _work_ как конструктор копии C++, но компилятор Java не относится к нему иначе, чем к любому другому конструктору. –

+0

Спасибо @jameslarge. Да, это правильно. У C++ есть конструктор копирования, но Java не имеет. Здесь я просто «пытаюсь» получить экземпляр типа конструктора из этой программы. – Aaditya

ответ

1

В первом конструкторе вы устанавливаете поля id и name, а второй конструктор устанавливает поля i и n.

При печати оба раза печать значения i и n, которые не заданы для первого объекта, поэтому они 0 и null соответственно.

Это модификация, которая приводит к выводу, который, как я считаю, вы ожидаете.

class student6 { 

    int id; 
    String name; 

    student6(int a, String b) { 
     id = a; 
     name = b; 
    } 

    student6(student6 s) { 
     id = s.id; 
     name = s.name; 
    } 

    void display() { 
     System.out.println(id + "..." + name); 
    } 

    public static void main(String args[]) { 
     student6 s1 = new student6(11, "Suresh"); 
     student6 s2 = new student6(s1); 

     s1.display(); 
     s2.display(); 
    } 
} 
+0

От первого конструктора, когда установлены «id» и «name», почему значения не предоставляются «i» и «n» из второго конструктора. или есть какой-либо способ получить «i» и «n», заселенный таким образом. – Aaditya

2

s1 только инициализировать int id; и String name;: эта линия

student6 s1 = new student6(11, "Suresh"); 

называет Первый конструктор

student6(int a, String b) { 
    id = a; 
    name = b; 
} 

Так, призывающую

System.out.println(i + "..." + n); 

напечатает значения по умолчанию для i и n

5

Вы должны изменить скопировать конструктор логики от

student6(student6 s) 
{ 
i=s.id; 
n=s.name; 
} 

в

student6(student6 s) 
{ 
    id=s.id; 
    name=s.name; 
} 

В вашем методе отображения вы печатаете id и name. Поэтому вы должны инициализировать их только для того, чтобы увидеть результат.

И, пожалуйста, следуйте Java naming conventions. Имена классов начинаются с буквы «Столица». student6 должен быть Student6

P.S: Спасибо за печать мое имя;)

+0

@ Суреш, я согласен с логикой и измененным кодом, который вы предоставили. Он работает так, как ожидалось. Мне просто интересно, почему «i» и «n» не могут иметь одинаковые значения (когда значения назначаются конструктором), как «id» и «name». – Aaditya

+0

@Aaditya Смотрите, они получили назначение. Но вы не печатаете их в своих методах отображения. Вы назначаете переменные 'i' и' n' и печатаете 'id' и' name' –

+0

@Suresh: - Получил ответ, только чтобы вся переменная как статическая работа работала для получения ожидаемого результата: - static int Я бы; статическое имя строки; static int i; статическая строка n; , так что все значения будут сохранены, и вывод будет таким, как ожидалось. – Aaditya