2014-02-12 3 views
0

У меня есть код Java:Получил неожиданный выход в Java

class Protected{ 
    int n = 1; 

    public Protected(){ 
     System.out.println("Constructor of protected"); 
     System.out.println("========================"); 
     System.out.println("n = "+n); 
     System.out.println(); 
    } 
} 
class Derived extends Protected{ 
    Derived(){ 
     System.out.println("Constructor of derived"); 
     System.out.println("======================"); 
     System.out.println("n = "+(n+1)); 
    } 
} 

public class Demo{ 
    public static void main(String args[]){ 
     Derived ob2 = new Derived(); 
    } 
} 

Я получил результат, как:

constructor of protected 
======================== 
n=1 

constructor of Derived 
======================== 
n=2 

Это то, что я хочу:

constructor of Derived 
======================== 
n=2 
+0

Вы не можете предотвратить суперкласс Инициирования , Вы не должны вводить побочные эффекты в конструктор, вместо этого вы должны добавить метод для печати этой информации и переопределить ее. Тогда он будет делать то, что вы хотите. –

ответ

7

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

Чтобы удалить этот вывод, вы можете выполнить одно из следующих действий:

1) Удалите операторы вывода из конструктора суперкласса.

2) Создайте еще один конструктор в суперклассе, который ничего не выводит и явно вызывает его в конструкторе подкласса.

Section 8.8.7 of the JLS состояние:

Если тело конструктора не начинается с явным вызовом конструктора и конструктора объявляемым не является частью изначального класса Object, то тело конструктора неявно начинается с вызовом конструктора суперкласса «super();» - вызов конструктора его прямого суперкласса, который не принимает аргументов.

0

Вы не должны расширьте суперкласс, чтобы получить желаемый результат. Или вы можете определить другой перегруженный конструктор в классе Super, и его нужно явно вызвать в подклассе Constructor.

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

+0

Причина проголосовали? –

1

Это то, что происходит неявно:

class Derived extends Protected{ 
     Derived(){ 
     super(); // <--- This is called whether you want to or not 
     System.out.println("Constructor of derived"); 
     System.out.println("======================"); 
     System.out.println("n = "+(n+1)); 
    } 

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

JLS 12 Execution/12.5 Creation of New Class Instances

Непосредственно перед ссылкой на вновь созданный объект возвращается в качестве результата, указанный конструктор обрабатывается для инициализации нового объекта, используя следующую процедуру:

  1. Назначьте аргументы для конструктора [...]
  2. Если этот конструктор начинается с явного вызова конструктора другого конструктора в том же классе (с использованием), тогда [...]
  3. Этот конструктор не начинается с явного вызова конструктора другого конструктора в том же классе (с использованием this).Если этот конструктор предназначен для класса, отличного отObject, , тогда этот конструктор начнет с явного или неявного вызова конструктора суперкласса (с использованием super).
  4. выполнять экземпляр инициализаторы и экземпляр инициализаторы переменной для этого класса [...]
  5. Выполнить остальную часть тела этого конструктора [...]
Смежные вопросы