Это возможно Интерфейс внутренне наследует класс объекта - PullRequest
0 голосов
/ 25 февраля 2019

Интерфейс Неявно наследует класс Object.Поскольку интерфейс SubInterface default Метод вызывает метод Object class hashCode.Это возможно, как и почему ..?

package com.oca.test.exam;

    interface SuperInterface {
        default void printStuff() { System.out.println("Default Method"); }
    }

    interface SubInterface extends SuperInterface {
        default void doStuff() {
            this.printStuff();
            System.out.println(this.hashCode());
        }
    }

    public class InterfaceAbstractCombination implements SubInterface{

        public static void main(String[] args) {
            SubInterface sub = new InterfaceAbstractCombination();
            sub.doStuff();
        }
    }

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Класс hashCode из InterfaceAbstractCombination предоставляется в иерархии наследования.this не относится к интерфейсу, даже если он имеет метод default.

Попробуйте запустить приведенный ниже код, вы увидите тот же hashCode при печати:

package com.oca.test.exam;

  public class InterfaceAbstractCombination implements SubInterface {

    public static void main(String[] args) {
        SubInterface sub = new InterfaceAbstractCombination();
        sub.doStuff();
        System.out.println(sub.hashCode());
    }
    }

    interface SuperInterface {
    default void printStuff() {
        System.out.println("Default Method");
    }
    }

    interface SubInterface extends SuperInterface {
    default void doStuff() {
        this.printStuff();
        System.out.println(this.hashCode());
    }
    }
0 голосов
/ 25 февраля 2019

Интерфейс не наследует классы Object.Класс, который реализует интерфейс SubInterface, наследует класс Object.

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

Так что InterfaceAbstractCombination класс реализует SubInterface, и когда вы вызываете doStuff(), вы вызываете егона экземпляре InterfaceAbstractCombination, который предоставляет this.hashCode(), унаследованном от класса Object, поэтому this будет ссылаться на экземпляр класса, реализующего интерфейс.

Одна вещь, которую следует отметить, есливы проверяете JLS spec

Если у интерфейса нет прямых суперинтерфейсов, то этот интерфейс неявно объявляет открытый абстрактный метод-член m с сигнатурой s, типом возврата r и предложением throwst соответствует каждому общедоступному методу экземпляра m с сигнатурой s, типом возврата r и оператором throws t, объявленным в Object, если интерфейс явно не объявил метод с такой же сигнатурой, тем же типом возврата и совместимым предложением throws.

Так вот почему вы можете звонить SuperInterface.super.hashCode();.

enter image description here

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