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

Почему конструкторы не могут быть унаследованы в java?

Я новичок в языке Java-программирования, недавно я изучил, что конструкторы не могут быть унаследованы в java, может ли кто-нибудь объяснить почему?

Я уже прочитал эту ссылку на С++

4b9b3361

Ответ 1

Простыми словами, конструктор нельзя наследовать, поскольку в подклассах оно имеет другое имя (имя подкласса).

class A {
   A();
}

class B extends A{
   B();
}

Вы можете сделать только:

B b = new B();  // and not new A()

Вместо этого методы наследуются с "одним и тем же именем" и могут использоваться.

По причине: Не имеет смысла наследовать конструктор, поскольку конструктор класса A означает создание объекта типа A, а конструктор класса B означает создание объекта класса B.

Вы все еще можете использовать использовать конструкторы из реализации внутри B, но:

class B extends A{
   B() { super(); }
}

Ответ 2

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

Вещи разные на уровне байт-кода. Когда объект создан, вызываются два оператора:

  1. new - выделяет память для объекта
  2. invokespecial - вызывает конструктор на вновь выделенном фрагменте памяти

Мы можем изменить байт-код так, чтобы память выделялась для дочернего класса, а конструктор вызывался из родительского класса. В этом случае можно сказать, что конструкторы наследуются. Одно замечание, если мы не отключим проверку байтового кода, JVM выдаст исключение при загрузке класса. Мы можем сделать это, добавив аргумент -noverify.

Заключение:

  1. Конструкторы не наследуются на уровне языка из-за принципов ОО
  2. Конструкторы наследуются на уровне байт-кода

Ответ 3

Причина, упомянутая в документах Наследования

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

Вы можете ссылаться на документы Предоставление конструкторов для ваших классов

Ответ 4

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

Ответ 5

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

Таким образом, наследование практически невозможно как таковое. Однако в конструкции можно вызвать другие конструкторы.

  • В том же классе, используя this(...);
  • Из расширенного класса с помощью super(...);

Пример

class A {
    A() { }          // Constructor
    A(int a) { }     // Constructor
    A(boolean c) { } // Constructor
}
class B extends A {
    B() {
        this(3, 7);
    }
    B(int a) {
        super();
    }
    B(String b) {
        super(7);
    }
    B(int a, int c) { // Calls super() implicitly
    }
}
A a = new B(8):

К сожалению, нет возможности использовать конструктор для булева:

B b = new B(true): // ERROR

Языковые конструкции могли бы реализовать такую ​​вещь, как:

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

Это похоже на раздувание кода. И не просто указатель в таблице виртуальных методов, с помощью которой работает метод наследования/переопределения метода.

Ответ 6

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

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

"Чтобы вызвать конструктор родительского класса в дочернем классе, вам всегда нужно" супер "ключевое слово. Поэтому конструкторы родительского класса" не доступны напрямую", как методы родительского класса в дочернем классе, поэтому мы можем сказать, что конструкторы не могут быть унаследованы.

Ответ 7

Только поля, методы и вложенные классы являются membe любого класса, а не Constructors. Подкласс наследует все члены типа (поля, методы и вложенные классы) из своего суперкласса. Конструкторы не являются членами, поэтому они не наследуются подклассами, но конструктор суперкласса может быть вызван из подкласса.

Ответ 8

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

Ответ 9

Синтаксические ограничения часто можно обойти, если есть какая-либо причина для концепции концептуально. С этим, я считаю, настоящая причина не поддерживать наследование конструктора обусловлена ​​не синтаксическими ограничениями, а скорее семантикой.

Концептуальное наследование предоставляет механизм для получения (или наследования) поведения и, скорее всего, без написания какой-либо части кода, поскольку его целью является предоставление повторного использования кода. Для дочернего класса он не имеет права наследовать поведение инициализации своего родительского класса. В конце концов, унаследованное поведение находит свое лучшее применение, когда внешний вызывающий может использовать его, не зная, кто (в родительской цепочке) фактически реализовал его. Как вы можете видеть, у вызывающего абонента практически нет бизнеса, знающего, как родительский класс инициализируется через его дочерний класс, нет никакой заметной причины для поддержки наследования для конструктора (родительских классов).

Ответ 10

вы не можете наследовать конструкторы, но вы можете наследовать инициализированное значение в конструкторе, например

class test1 {
    int a,b;
    test1(){
        a = 100;
        b = 20;
    }
}

class test2 extends test1 {
    test2(){
        // do something
    }
}

class test {
    public static void main(String[] args) {
        test2 t = new test2();
        int a = t.a;
        int b = t.b;
        System.out.println(a+b);
    }
}

Ответ 11

Нет, как сказал Михаил; конструкторы не наследуются. Вы не можете наследовать конструктор из суперкласса в свой подкласс. Однако, когда объект создается с помощью оператора "new" в java, этот объект наследует все конструкторы из своего подкласса в его суперкласс (родительский), даже в том числе в абстрактном классе (поскольку они также являются суперклассом).