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
, в то время как часть вашего приложения, отвечающая за доставку, будет нуждаться в различных режимах поведения, предоставляемых конкретными классами.
См. Также Википедию для Абстракт и бетон и Класс (компьютерное программирование) .