Абстрактный родительский класс вызывает метод производного класса - PullRequest
3 голосов
/ 30 мая 2019

Так что мне было интересно, как создаются экземпляры классов.

public abstract class test {

    int count;

    public test(){
        count();
        count();
        System.out.println("test" + this.count);
    }
    abstract void count();
}

public class derive extends test{

    int count;

    public derive(){
        System.out.println("derive");
    }
    @Override
    public void count(){
        count++;
    }
}
    public static void main(String[] args) {
    derived o = new derived();
}

Вывод:

test0

1008 * выведет *

Как получилось считать = 0? а не 2?

Ответы [ 3 ]

4 голосов
/ 30 мая 2019

Поскольку у вас есть две переменные с именем count. Тот, который виден в test (но затенен) тем, который находится в derive. Удалите int count из derive и отметьте protected в test.

2 голосов
/ 30 мая 2019

Конструктор суперкласса вызывается первым.Он вызывает count() дважды.При полиморфизме вызывается count() в derive, увеличивая count до 2.Приращивается переменная count в derive, потому что это означает, что простое имя count означает в подклассе.Переменная count в test является скрытой count в derive.

Однако оператор print ссылается на область действия count в суперклассе,который по-прежнему 0.

Обратите внимание, что, когда конструктор суперкласса завершается, тело конструктора подкласса может, наконец, выполняться.Это включает в себя предоставление всем переменным экземпляра начальных значений.Здесь, даже если count уже 2, оно все равно «инициализируется» на 0.Поэтому, даже если вы добавите оператор печати в конструктор подкласса, вы все равно получите там 0 для count.

Чтобы получить count из 2, удалите countв derive и замените count в test на protected или на частный пакет (без модификатора доступа).Это заставит count() увеличить значение переменной count на test.

1 голос
/ 30 мая 2019

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

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