Возможно ли переопределение конструктора? - PullRequest
27 голосов
/ 24 февраля 2011

Что я знаю, так это то, что компилятор записывает конструктор по умолчанию без аргументов в байт-код. Но если мы напишем это сами, этот конструктор вызывается автоматически. Является ли этот феномен переопределением конструктора?

Ответы [ 13 ]

22 голосов
/ 24 февраля 2011

Конструкторы не являются обычными методами, и их нельзя "переопределить".Утверждение, что конструктор может быть переопределен, будет означать, что конструктор суперкласса будет видимым и может быть вызван для создания экземпляра подкласса.Это не так ... у подкласса нет конструкторов по умолчанию (кроме конструктора без аргументов , если класс, который он расширяет, имеет один).Он должен явно объявлять любые другие конструкторы, и эти конструкторы принадлежат ему, а не его суперклассу, даже если они принимают те же параметры, что и конструкторы суперкласса.только аспект того, как работают конструкторы и не имеет ничего общего с переопределением.

21 голосов
/ 24 февраля 2011

То, что вы описываете, не имеет преимущественного значения.Если вы не укажете конструктор по умолчанию, компилятор создаст конструктор по умолчанию.Если это подкласс, он вызовет родительский конструктор по умолчанию ( super () ), он также инициализирует все переменные экземпляра значением по умолчанию, определяемым значением по умолчанию типа (0 для числовых типов, false для логических значений)или null для объектов).

Переопределение происходит, когда подкласс имеет то же имя, число / тип параметров и тот же тип возврата, что и метод экземпляра суперкласса.В этом случае подкласс переопределит метод суперкласса. Информация о переопределении здесь .

13 голосов
/ 24 февраля 2011

Это никогда не возможно.Переопределение конструктора никогда не возможно в Java.

Это потому, что

Конструктор выглядит как метод, но имя должно быть как имя класса, а не возвращаемое значение.

Переопределение означает то, что мы объявили в Superкласс, который мы должны объявить в подклассе, он называется Overriding.Имя суперкласса и имена подклассов различаются.

Если вы пытаетесь написать конструктор суперкласса в подклассе, то подкласс будет воспринимать это как метод, а не конструктор, поскольку имя не должно совпадать с именем подкласса.И это даст ошибку компиляции, что методы не имеют возвращаемого значения.Поэтому мы должны объявить как void, тогда только он скомпилируется.


Посмотрите на следующий код:

Class One
        {
         ....
         One() { // Super Class constructor
          .... 
        }

        One(int a) { // Super Class Constructor Overloading
          .... 
        }
 }

Class Two extends One
                   {
                    One() {    // this is a method not constructor 
                    .....      // because name should not match with Class name
                   }

                    Two() { // sub class constructor
                   ....  
                   }

                   Two(int b) { // sub class constructor overloading
                   ....
                  }
 }  
3 голосов
/ 24 февраля 2011

Невозможно переопределить конструктор.Конструктор можно рассматривать как статический, подкласс не может переопределить его супер-конструктор.

Конечно, вы можете вызвать защищенный метод в конструкторе суперкласса, а затем переопределить его в подклассе, чтобы изменить конструктор суперкласса.Тем не менее, многие люди предлагают не использовать хитрость, чтобы защитить поведение конструктора суперкласса.Например, FindBugs предупредит вас, что конструктор вызывает не финальный метод.

3 голосов
/ 24 февраля 2011

Вы можете иметь много конструкторов, если они принимают разные параметры.Но компилятор, помещающий конструктор по умолчанию, не называется "переопределением конструктора".

2 голосов
/ 30 апреля 2015

Нет, невозможно переопределить конструктор. Если мы попытаемся сделать это, то произойдет ошибка компилятора. И это никогда не возможно в Java. Давайте посмотрим на пример. Он спросит, пожалуйста, напишите тип возврата метода. означает, что он будет рассматривать этот переопределенный конструктор как метод, а не как конструктор.

package com.sample.test;

class Animal{

    public static void showMessage()
    {
        System.out.println("we are in Animal class");
    }
}

class Dog extends Animal{

    public void DogShow() 
    {
        System.out.println("we are in Dog show class");
    } 

    public static void showMessage()
    {
        System.out.println("we are in overriddn method of dog class");
    }
}

public class AnimalTest { 

    public static void main(String [] args)
    {
        Animal animal = new Animal();
        animal.showMessage();

        Dog dog = new Dog();
        dog.DogShow();

        Animal animal2 = new Dog();
        animal2.showMessage();
    }

}
1 голос
/ 05 августа 2014

Поскольку конструктор не может быть унаследован в Java, а переопределение метода требует наследования.Следовательно, это не применимо.

1 голос
/ 24 февраля 2011

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

Это не правильно. Конструктор без аргументов называется , если вы его вызываете, и независимо от того, написали ли вы его сами или нет. Он также вызывается автоматически, если вы не кодируете явный вызов super (...) в производном классе.

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

0 голосов
/ 21 апреля 2015

Переопределение конструктора невозможно по следующей причине.

Имя конструктора должно совпадать с именем класса. В практике наследования вам нужно создать два класса с разными именами, следовательно, два конструктора должны иметь разные имена. Таким образом, переопределение конструктора невозможно, и эта мысль даже не имеет смысла.

0 голосов
/ 07 апреля 2013

переопределение метода в Java используется для улучшения производительности кода, написанного ранее.

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

InputStream fis=new FileInputStream("a.txt");
int size=fis.available();

size вернет общее количество байтов в a.txt так что

...