2013-07-20 1 views
3

У меня возник вопрос о конструкторах по умолчанию в java.
Насколько я читал о конструкторах в java, конструктор по умолчанию инициализирует все переменные экземпляра значениями по умолчанию. но что, если мы определяем конструктор для класса, то как же переменные инициализируются значениями по умолчанию, если мы хотим их?Почему переменные инициализируются значениями по умолчанию, даже если у нас есть конструктор

Предположим, у меня есть 2 файла a.java

public class a 
{ 
    int x; 

    public a(int z) 
    { 
     if(z > 0) 
     { 
      x = z; 
     } 
    } 

    public void get() 
    { 
     System.out.println(x); 
    } 
} 

и b.java

public class b 
{ 
    public static void main(String[] args) 
    { 
     a obj = new a(-4); 

     obj.get(); 
    } 
} 

Теперь здесь условие (г> 0) не выполняется, так что х инициализируется нулем. но что именно делает это, поскольку они не являются конструкторами по умолчанию в классе a.

+1

Вы никогда не вызываете конструктор по умолчанию 'a' здесь ... – fge

+1

Класс' a' не имеет конструктора по умолчанию. –

ответ

10

Поля, которые объявлены, но не инициализированы будет установлен на разумном умолчанию компилятором. Вообще говоря, это значение по умолчанию будет равно нулю или нулевому, в зависимости от типа данных.

Source

Это означает, что компилятор сделает это за вас, когда вы строите программу.

+0

+1 Для boolean значение по умолчанию false –

+1

@juergen d - конструктор по умолчанию не инициализирует поля их значениями по умолчанию. если нет, то какая цель в java? – Shashi

+1

Целью конструкторов по умолчанию не является инициализация переменных с их значением по умолчанию. Это происходит автоматически. Вы должны сообщить об использовании конструкторов по умолчанию. он может использоваться для случаев с ящиками. –

2

В вашем a классе (переименованный A ниже, чтобы следовать конвенции), как вы написали его, нет конструктор не по умолчанию. Конструктор по умолчанию для класса - это конструктор, который равен public и не имеет аргументов.

С кодом вы написали, это не получится:

A a = new A(); 

Как только вы объявляете другой конструктор в классе, нет конструктора по умолчанию не больше.

Что касается переменных экземпляра, если вы не инициализируете их явно, они устанавливаются в значения по умолчанию. То есть:

public class A 
{ 
    private int x; 

    public int getX() 
    { 
     return x; 
    } 
} 

, если вы:

final A a = new A(); 
System.out.println(a.getX()); 

это напечатает 0. Класс выше точности эквивалентно:

public class A 
{ 
    private int x /* = 0 -- default value for uninitialized int instance variables */; 

    // redundant 
    public A() 
    { 
    } 

    public int getX() 
    { 
     return x; 
    } 
} 
0

Когда вы объявляете переменную в Java, это по умолчанию инициализируется, как это значение по умолчанию. Для примитивных типов является то, что 0 (или его эквивалент), для объектов является то, что null

Так что в вашем примере, имеет x initialy значение 0, и вы никогда не перезаписать его.

0

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

public class Car{ 
    int numOfWheels; 

public Car(int numOfWheels){      //created constructor// 

    this.numOfWheels=numOfwheels; 
    } 
    } 
    public static void main(string[]args){ 

Car skoda = new Car(4); 
}       *//initialized value to the object using constructor in parenthesis//*      
0
public class a 
{ 
    int x; 

    public a(int z) 
    { 
    //as we know that every class base class is Object class this constructor first statement is super(); means compiler automatically add this statement that call object class default constructor and initialize default values 
     if(z > 0) 
     { 
      x = z; 
     } 
    } 

    public void get() 
    { 
     System.out.println(x); 
    } 
} 
0

общественный класс а

{

INT х;

общественного пользования (интермедиат г)

{

/* Как мы знаем, что каждый класс базовый класс Object .....

компилятор автоматически добавляет супер(); что конструктор класса вызова объекта по умолчанию

, что инициализации значения переменной экземпляра */

, если (г> 0)

{

х = г;

}

}

общественного недействительными Get()

{

System.out.println (х);

}

} общественного класса б

{

public static void main(String[] args) 

{ 

    a obj = new a(-4); 


    obj.get(); 

} 

}

// Другой пример ниже

/* Класс A

{

общественного А()

{

System.out.println («Арджун Сингх Рават и Ашиш Чиналия»);

}

}

класс B расширяет

{

общественности B()

{

// компилятор автоматически добавить супер();

}

}

класс вызова

{

государственной статической силы основных (String Arg [])

{

B BB = новый B ();

}

} */

спасибо ...

0
public class Demo { 
    static int a; 
    Demo(int b) 
{ 
System.out.println(" Constructor"); 
} 
public static int func() 
{ 
    System.out.println(a); 
    return 1; 
} 
public static void main(String args[]) 
{ 

    new Demo(func()); 
} 
} 

Output 
0 
Constructor 

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