Конструкторы и Наследование - PullRequest
1 голос
/ 09 марта 2012

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

public abstract class PropertyDB {

private int hectares;

    private String crop;

    private int lotWidth;

    private int lotDepth;

    private int buildingCoverage;

    private int lakeFrontage;

    private int numBedrooms;

    private int listPrice;


    //public abstract int getPricePerArea();
    //public abstract int getPricePerBuildingArea();

    public PropertyDB(int newHectares, String newCrop, int newLotWidth, int newLotDepth, 
            int newBuildingCoverage, int newLakeFrontage, int newNumBedrooms, int newListPrice){
        hectares = newHectares;
        crop = newCrop;
        lotWidth = newLotWidth;
        lotDepth = newLotDepth;
        buildingCoverage = newBuildingCoverage;
        lakeFrontage = newLakeFrontage;
        numBedrooms = newNumBedrooms;
        listPrice = newListPrice;
    }
}


public class FarmedLand extends PropertyDB{


    public FarmedLand(int newHectares, int newListPrice, String newCorn){
        //super(270, 100, "corn");

        hectares = newHectares;
        listPrice = newListPrice;
        corn = newCorn;
    }
}

Ответы [ 5 ]

2 голосов
/ 09 марта 2012

неявный конструктор PropertyDB() существует только в том случае, если вы не определяете какие-либо другие конструкторы, и в этом случае вам придется явно определить PropertyDB() конструктор.

причина появления этой ошибки "Неявный супер-конструктор PropertyDB() не определено. Должен явно вызывать другой конструктор. "в том, что в вашем конструкторе public FarmedLand(int newHectares, int newListPrice, String newCorn), super() автоматически вызывается как первый оператор, который не существует в вашем суперклассе.

Вот упрощенный пример:

public class A { }

может бытьсоздается с использованием A a = new A(), потому что public A() { } является неявным конструктором класса A.

public class A {
    public A(int z) { /* do nothing*/ }
}

может не быть создан с использованием A a = new A(), поскольку путем определения явного конструктора public A(int z)неявный больше не доступен.

Переход к конструкторам и наследованию, из Раздел спецификации языка Java 8.8.7 :

Если тело конструктора не имеетначинаются с явного вызова конструктора, и объявленный конструктор не является частью первичного класса Object, затем компилятор неявно предполагает, что тело конструктора начинается с вызова конструктора суперкласса "super ();", вызова конструктораэто прямой суперкласс, который не принимает аргументов.

Так что в вашем случае выполняется первое выражениеКонструктор public FarmedLand(int newHectares, int newListPrice, String newCorn) является неявным вызовом super();, который в вашем случае не определен неявно (уже определен конструктор public PropertyDB(int, String, ...)) или явно (его нет в исходном коде)

1 голос
/ 09 марта 2012

Если у вас есть производный класс, который extends базовый класс, базовый класс всегда создается перед производным классом. Если вы не указали явно, какой конструктор использовать для базового класса (как в вашем примере), Java предполагает, что вы подразумевали конструктор без параметров (в вашем случае конструктор PropertyDB()).

Но подождите - у PropertyDB нет конструктора без параметров! Поэтому ваш единственный вариант - использовать super, чтобы компилятор Java знал, какой конструктор вызывать для базового класса. В вашем случае есть только один конструктор, поэтому вы должны использовать его со всеми 8 аргументами. Если вы хотите использовать меньше аргументов, вам нужно либо указать значения по умолчанию (например, передать 0), либо определить больше конструкторов для PropertyDB, которые принимают меньше аргументов.

0 голосов
/ 09 марта 2012

Ваш суперкласс имеет только один конструктор, поэтому ваш конструктор подкласса должен вызывать его.Обойти это невозможно: суперкласс имеет (например) поле lotWidth, поэтому подкласс обязательно имеет это поле, и суперкласс инициализирует это поле в своем конструкторе, поэтому он обязательно будет инициализирован в подклассе.

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

0 голосов
/ 09 марта 2012

Используйте super(newHectares, newCorn, 0, 0, 0, 0, newListPrice); вместо.0 - это значение по умолчанию int в любом случае.

0 голосов
/ 09 марта 2012

Ошибка, которую вы наблюдаете, связана с тем, что класс PropertyDB не имеет конструктора по умолчанию (без аргументов).Либо создайте его в PropertyDB, либо вызовите существующий конструктор суперкласса PropertyDB(int newHectares, String newCrop, int newLotWidth, int newLotDepth, int newBuildingCoverage, int newLakeFrontage, int newNumBedrooms, int newListPrice) из конструктора FarmedLand, используя super.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...