Подтвердить что ты не робот

Возможно ли переопределение конструктора?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Все, что вы упоминаете о умолчанию, не содержит конструкторы arg, - это всего лишь аспект того, как работают конструкторы и не имеет ничего общего с переопределением.

Ответ 3

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

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

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

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

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


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

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
                   ....
                  }
 }  

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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();
    }

}

Ответ 9

Ваш пример не является переопределением. Переопределения технически происходят в подклассе, но в этом примере метод contructor заменяется в исходном классе.

Ответ 10

Следует также отметить, что вы не можете переопределить конструктор в подклассе с конструктором имени суперкласса. В правиле OOPS указано, что конструктор должен иметь имя в качестве имени класса. Если мы попытаемся переопределить конструктор суперкласса, он будет рассматриваться как неизвестный метод без возвращаемого типа.

Ответ 11

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

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

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

Ответ 12

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

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

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

size вернет общее количество байтов, доступных в файле .txt поэтому

Ответ 13

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

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