2016-12-04 2 views
0

Я пишу программу в Java и иметь проблему с inheritance.The кодом Я бег имеет такую ​​структуру:Как Наследуйте класс без вызова его конструкторы в Java

public class BaseClass 
{ 
ObjectInputStream a; 
ObjectOutputStream b; 

public BaseClass(ObjectInputStream a, ObjectOutputStream b) 
{ 
    this.a = a; 
    this.b = b; 
} 

//Some other code.... 

Thread subClass = new Thread(new SubClass()); 
subClass.start(); 

} 

А потом вот SubClass :

public SubClass extends BaseClass implements Runnable 
{ 
    //Code for SubClass... 
} 

Затем, когда я скомпилировать код, единственная ошибка я получаю это

./SubClass.java:6: error: constructor BaseClass in class BaseClass' 
cannot be applied to given types; 
public class SubClass extends BaseClass implements Runnable 
    ^
    required: ObjectInputStream,ObjectOutputStream 
    found: no arguments 

Я Assum что проблема возникает из-за того, что я расширяю BaseClass, у которого есть конструктор, поэтому он вызывается, когда я наследую класс, но я не совсем уверен. Есть ли способ вызвать этот конструктор с правильными аргументами? Или, еще лучше, способ вообще не ссылаться на конструктор? Любая помощь приветствуется, и спасибо за ваши ответы.

+0

Если вы правильно обработали, вы можете сделать 'super (null, null)' в конструкторе для 'SubClass' – 0xA2C2A

+0

Нет. Вам нужно вызвать super (someObjectInputStream, someObjectOutputStream) из всех конструкторов вашего подкласса. У меня такое чувство, что вы злоупотребляете наследованием. Вы должны объяснить, чего вы пытаетесь достичь, что такое BaseClass и SubClass. –

+0

Итак, ваш реальный вопрос: «Как вызвать конструктор базового класса в java»? Вы пытались ввести свой вопрос в Google? Или через какой-то учебник по основам Java? (Извините за тон, но это * очень простая Java, и SO пытается не быть «пожалуйста, прочитайте документы для меня», по крайней мере, для этого основного материала). – hyde

ответ

0

Ваш подкласс должен иметь конструктор, который принимает в

ObjectInputStream a, ObjectOutputStream b 

и чем передать его в базовый класс с помощью

super(a, b): 

Я считаю, что это будет выглядеть так:

class Subclass extends BaseClass { 
    SubClass(ObjectInputStream a, ObjectOutputStream b) { 
     super(a, b); 
    } 
} 

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

0

Базовый класс не имеет конструктора по умолчанию, ведьма предполагает, что он должен получить один ObjectInputStream и один ObjectOutputStream. Итак, SubClass должен иметь такой конструктор, как тот, который вызывает super, передавая аргументы. Я хотел бы, чтобы вы:

  1. Обзора вашего наследства
  2. Смотрите, если базовый класс может иметь конструктор по умолчанию
  3. Создать конструктор по умолчанию в SubClass переходе нуля в super ->super(null,null)
  4. Создать конструктор по умолчанию в SubClass Проходящие две необходимые объекты

Существует нет способа нет t вызовите родительский конструктор. Компилятор автоматически добавляет вам вызов super.

+0

Даже если у него есть «конструктор, подобный этому», этот конструктор должен вызывать super() и передавать аргументы. –

+0

Да, я знаю, я объяснял это – BrunoDM

0

Вы не призыв к super - родитель cunstractor:

public SubClass extends BaseClass implements Runnable 
{ 
    //must implement the following contractor: 
    public SubClass(ObjectInputStream a, ObjectOutputStream b /*some other parameters*/){ 
     super(a,b); 
    } 

// the rest of the code..... 
} 
-1

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

+1

Нет. Вам нужно вызвать супер конструктор с действительными аргументами. Независимо от того, сделаете ли вы это от конструктора, принимающего те же параметры, или нет, это не имеет значения. И конструктор не инициализирует класс. Он инициализирует объект. И, наконец, добавление дополнительного конструктора - это не то, что вам нужно сделать. Все конструкторы должны вызвать супер-конструктор. –

0

Основная идея наследования заключается в том, что общедоступные методы и переменные суперкласса будут доступны в подклассе. (Это больше, чем просто это утверждение, но этого пока достаточно). Поэтому в вашем случае, когда вы расширяете BaseClass до SubClass, у вас есть две переменные (ObjectInputStream и ObjectOutputStream), доступные вам в SubClass.

Таким образом, вы должны предоставить им некоторые начальные значения при создании объекта подкласса. Следовательно, вы должны добавить в свой SubClass следующий конструктор.

public SubClass(ObjectInputStream a,ObjectOutputStream b){ 
     super(a,b); // The order in super should be same as the order of arguments in your BaseClass constructor! Make a not of this. 
    } 

Примечание: порядок аргументов в методе super() важен!

Смежные вопросы