2015-12-28 2 views
1

Предположим, что мы имеем следующее определение.Метод Java Instanceof Confusion

interface Vessel{} 
interface Toy{} 
class Boat implements Vessel{} 
class Speedboat extends Boat implements Toy{} 

В основном, мы имеем следующие:

Boat b = new Speedboat(); 

и (b instanceof Toy) оценивает быть true? Зачем? Я понимаю, что ссылочный тип b равен Boat, но Boat не имеет отношения к Toy, поэтому он должен быть false, но ответ true.

+0

Вы должны прочитать [Какая разница между переменной, объектом и ссылками?] (Http://stackoverflow.com/questions/32010172/what-is-the-difference-between-a -переменный-объект-и-ссылка). –

ответ

7

Boat не имеет ничего общего с Toy, вы правы.

Но вы не обрабатывает Boat здесь, но фактически SpeedBoat, который хранится в Boat переменной. И это SpeedBoat является экземпляром Toy.

типа, в котором вы храните new Speedboat() не имеет значения, поскольку Java проверяет во время выполнения Wether или нет фактических объектов является экземпляр что-то другое.

Таким образом, вы можете написать что-то вроде

public boolean callSpeedBoatMethodIfPossible(Boat b) { 
    if (b instanceof SpeedBoat) { 
     ((SpeedBoat)b).driveVerySpeedy(); 
    } 
} 
3

Согласно http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

Оператор InstanceOf сравнивает объект к заданному типу. Вы можете использовать его для проверки, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.

Таким образом, он проверяет тип объекта OBJECT, но не тип ссылки на объект.