2016-01-10 2 views
-4
class Machine { 

    private String name; 
    private int code; 

    public Machine(){ 
     this("back",1); 
     System.out.println("constructor working!!!!");   
    } 

    public Machine(String name){ 
     this("jick",1); 
     System.out.println("Second constructor!!!"); 
     this.name = name; 
    } 

    public Machine(String name, int code){ 
     // this(); compile time error 
     //this("back"); //compile time error 
      System.out.println("third constructor"); 
      this.name = name; 
      this.code = code; 
    } 
    } 

    public class Constructoroverloading{ 

    public static void main(String[] args) { 
     //Machine m1 = new Machine(); 
     // Machine m2 = new Machine("shruthi"); 
     // Machine m3 = new Machine("shruthi",20); 
    } 
} 

Вот программу я писал, у меня есть сомнения в том, что, почему моем третий конструктор не в состоянии назвать первые и вторые конструкторы. когда я пытался вызвать первый или второй конструктор, компилятор показывает, что рекурсивная ошибка вызова, я не совсем понимаю концепцию и почему я получаю эту ошибку времени компиляции.ниже программы очень много путаницы о конструкторе вызова очень новый для Java, пожалуйста, объясните концепцию ясно

+3

Как 'Machine (имя String, INT код)' вызова любого из двух других конструкторов, когда они их сами называют этот конструктор, он не имеет никакого смысла – MadProgrammer

+2

Попробуйте выполнить свой код, если он скомпилируется. Вы быстро поймете, почему это не имеет смысла. – Pshemo

+0

@ paulsm4 Я не думаю, что OP спрашивает о наличии * обеих * строк там, но говорит, что оба были судимы отдельно: «когда я пытался вызвать первый или второй конструктор ...». –

ответ

1

Допустим, что ваш код компилируется, и это выглядит как

public Machine(){ 
    this("foo"); 
    ... 
} 

public Machine(String name){ 
    this(); 
    ... 
} 

Теперь, что произойдет, если мы будем ссылаться на один из этих конструкторов? Давайте пройдем через этот код. Мы начнем с new Machine("enigma"):

  1. Machine(String name) вызывается
    1. и в первой инструкции она вызывает this();
    2. так код в Machine() это выполняется
      1. , который в первой инструкции вызывает this("foo");
      2. так Machine(String name) вызывается
        1. который внутренне снова вызывает в первой инструкции this();
        2. так сноваMachine() вызывается

... (и т.д. до, пока стек будет переполняться). Выхода из этого цикла нет, потому что первая инструкция в каждом конструкторе всегда вызывает другой конструктор, который не позволяет нам добавлять код, который может решить эту проблему.
Так как компилятор видит, что нет надлежащего stop point, это мешает вам скомпилировать такой код, пока вы не исправите эту ошибку.

+0

Спасибо, я понял очень четко ... – Prathyusha

+0

@shruthi Нет проблем. – Pshemo

+0

@shruthi BTW, если какой-то ответ (не обязательно мой) решает вашу проблему, вы можете принять его в качестве решения. Подробнее о принятии механизма по адресу: http://meta.stackexchange.com/a/5235/186652 – Pshemo

0

Проблема заключается в том:

1) У вас есть три различных конструкторов (OK)

2) Первые два каждого вызова третий (OK)

... НО ...

3) Третий конструктор НЕ МОЖЕТ вызова либо из первых двух ... потому что тогда это будет фактически называющий себя. Это называется Infinite recursion.

Вот рабочий пример кода:

/* 
* Sample output: 
* Machine(name, code) constructor: name=back, code=1 
* default constructor: name=back, code=1 
* Machine(name, code) constructor: name=jick, code=1 
* Machine(name) [email protected]: name=shruthi, code=1 
* Machine(name) [email protected]: name=shruthi, code=1 
* Machine(name, code) constructor: name=shruthi, code=20 
*/ 
    class Machine { 

    private String name = "default"; 
    private int code = 100; 

    public Machine(){ 
     this("back",1); // Note: the default constructor calls "Machine(name, code)" 
     System.out.println("default constructor: name=" + name + ", code=" + code);   
    } 

    public Machine(String name){ 
     this("jick",1); // // Note: this constructor ALSO calls "Machine(name, code)" 
     System.out.println("Machine(name) [email protected]: name=" + name + ", code=" + code);   
     this.name = name; 
     System.out.println("Machine(name) [email protected]: name=" + name + ", code=" + code);   
    } 

    public Machine(String name, int code){ 
     //this(); // error: recursive constructor invocation 
     //this("back"); // error: recursive constructor invocation 
     //either of these two statements would *call itself infinitely* 
     this.name = name; 
     this.code = code; 
     System.out.println("Machine(name, code) constructor: name=" + name + ", code=" + code);   
    } 

    } 

    public class Constructoroverloading{ 

    public static void main(String[] args) { 
     Machine m1 = new Machine(); 
     Machine m2 = new Machine("shruthi"); 
     Machine m3 = new Machine("shruthi",20); 
    } 

    } 
+0

спасибо за ваш ответ, я понял весь поток программы. – Prathyusha

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