Интерфейсы являются экземплярами объектов, а объекты являются экземплярами интерфейсов в Java? - PullRequest
0 голосов
/ 13 января 2019

У меня определен интерфейс с именем IntF

У меня также есть определенный класс под названием Cls, который реализует IntF.

А вот код клиента:

IntF i=new Cls();
Cls c=new Cls();
System.out.print(i instanceof Cls);
System.out.print(c instanceof IntF);

вывод truetrue

Почему именно это выход? Я подумал, что это было бы falsefalse.

Я думал, что i будет экземпляром IntF, но это не имеет смысла, потому что вы не можете действительно инициализировать интерфейсы, верно? Или ты можешь? Я чувствую себя комфортно с Java, но эта штука немного нечеткая.

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 13 января 2019

ключевое слово instanceof вводит в заблуждение здесь. Значение a instanceof B:

объект, на который ссылается переменная a, предоставляет все методы, определенные в class или interface B, поскольку тип объекта, на который ссылается a (его класс), является потомок класса или интерфейса B любым способом наследования Java.


Таким образом, у меня будет доступ только к методам, определенным в интерфейсе IntF, тогда как у c будет доступ к методам, определенным в классе Cls? И использование instanceof просто говорит, имеет ли B доступ ко всем методам, определенным в каком-либо классе или интерфейсе, которого придерживается A? - Анхель Гарсия

Это не столько вопрос "наличия доступа". На вопрос ответил
a instenceof B: я могу сохранить объект в a в переменной типа B, тогда методы доступа доступны только в B).

if(i instanceof Cls)
   Cls i2= (Cls)i;   

Но
Не вкладывайте слишком много усилий в понимание instanceof. Вам никогда не нужно это в реальной жизни, так как это инструмент, который эффективно предотвращает использование вами наиболее ценных преимуществ ООП: полиморфизм .

0 голосов
/ 14 января 2019

Object.getClass

Остальные два ответа верны относительно instanceof. Это может прояснить ваше мышление, чтобы узнать, что вы также можете получить фактический конкретный класс экземпляра.

Каждый класс в Java простирается от Object класса. И Object включает в себя метод getClass. Этот метод возвращает объект типа Class - но не думайте об этом слишком много, иначе это может повредить вашей голове. Суть в том, что вы можете запросить текстовое имя конкретного класса за вашим конкретным экземпляром.

String className = someInstance.getClass().getName() ;

Ниже приведен пример интерфейса Animal и 3 классов, реализующих этот интерфейс, Cat, Dog, Chihuahua. Класс Chihuahua расширяет Dog до yip вместо коры. Мы создаем все 3 конкретных класса, но каждый экземпляр храним как более общий Animal интерфейс. Обратите внимание, что мы можем получить наиболее конкретный подкласс экземпляра, например Dog против Chihuahua.

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Animal animal1 = new Cat() ;
        animal1.speak() ;
        System.out.println( animal1.getClass().getName() ) ;

        Animal animal2 = new Dog() ;
        animal2.speak() ;
        System.out.println( animal2.getClass().getName() ) ;

        Animal animal3 = new Chihuahua() ;
        animal3.speak() ;
        System.out.println( animal3.getClass().getName() ) ;
    }
}

interface Animal {
    public void speak() ;
}

class Dog implements Animal {
    @Override
    public void speak() {
        System.out.println( "Bark." ) ;
    }
}

class Chihuahua extends Dog {
    @Override
    public void speak() {
        System.out.println( "Yip." ) ;
    }
}


class Cat implements Animal {
    @Override
    public void speak() {
        System.out.println( "Meow." ) ;
    }
}

См. Этот код, запущенный в режиме реального времени на IdeOne.com.

Мяу.

Cat

Кора.

Dog

Ип.

чихуахуа


Я думал, что буду экземпляром IntF, но это не имеет смысла, потому что вы не можете действительно инициализировать интерфейсы, верно? Или можешь?

Нет, вы не можете создать экземпляр интерфейса в Java.

Но смысл полиморфизма («много фигур») состоит в том, что вы можете создать экземпляр объекта из класса, скажем, с помощью 5 методов, но при этом хранить ссылку на объект, как если бы это был только интерфейс Скажем 3 метода. Когда вы вызываете методы объекта через эту ссылку, вы можете вызывать только 3 метода. Компилятор не позволит вам вызывать другие 2 из 5 методов класса, поскольку с точки зрения интерфейса эти два других метода не существуют. Я думаю об этом (держа ссылку на объект в качестве интерфейса), как если смотреть через линзу цветного фильтра, блокируя некоторые длины волн, в то же время пропуская другие длины волн.

Мне комфортно с Java, но эта штука немного нечеткая.

Не волнуйся, пусть будет нечетко. Практика приносит ясность . Размышление об этом абстрактно (каламбур) делает концепции сложными для понимания.

Как только вы окажетесь в одной части вашей кодовой базы, куда вы хотите отправить сообщение, но вам все равно, будет ли оно отправлено по электронной почте или SMS , вы увидите мудрость Message интерфейс с конкретными классами EmailMessage & SmsMessage. Часть кода, составляющая сообщение, нуждается только в интерфейсных методах, в то время как часть кода, фактически отправляющая сообщение на своем пути, будет нуждаться в конкретных классах.

Когда вы обрабатываете выполнение почтового заказа и получаете свою первую международную почту с особыми потребностями, такими как таможенная декларация, тогда вы увидите необходимость в MailOrder интерфейсе с конкретными классами для DomesticMailOrder & InternationalMailOrder. Часть вашего приложения, в которой перечислены заказы для просмотра менеджером, нуждаются только в методах интерфейса, таких как getDollarValue, в то время как часть вашего приложения, отвечающая за доставку, будет нуждаться в различных режимах поведения, предоставляемых конкретными классами.

См. Также Википедию для Абстракт и бетон и Класс (компьютерное программирование) .

0 голосов
/ 13 января 2019

И i, и c содержат ссылку на экземпляр класса Cls. Поэтому оба instanceof Cls. И поскольку класс Cls реализует интерфейс IntF, оба являются instanceof IntF.

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