2013-09-12 6 views
1

Я понимаю, что при создании нового объекта, таких, как это:Заявленные типы и фактические типы

GeomObject tri = new Triangle(); 

является более общим и позволяет более resuability, но то, что происходит, когда три создается следующим образом:

Triangle tri = new Triangle(); 

Поскольку Triangle является подклассом GeomObject, не является ли все еще объектом GeomObject? Как объявленный тип влияет на компиляцию? Благодаря

* добавить: дополнительный вопрос: у меня есть

Integer n1 = new Integer(3); 
Object n2 = new Integer(4); 
System.out.println(n1.compareTo(n2)); 

Я попробовал это на Eclipse, и я получил ошибки, даже если я обращенных n1 с n2. Я думал, что n2.compareTo (n1) будет работать, потому что он будет вызывать метод Object CompareTo, и поскольку Integer является экземпляром объекта, он будет проходимым, но это не так. Не могли бы вы объяснить это?

ответ

8

Поскольку Triangle подкласс GeomObject, не tri еще GeomObject?

Да, это так. Используйте instanceof оператор, чтобы проверить это:

System.out.println((tri instanceof Triangl)); //prints true 
System.out.println((tri instanceof GeomObject)); //prints true 
System.out.println((tri instanceof Object)); //prints true because every class extends from Object 

Как объявленный тип влияет на компиляцию?

Это не повлияет в любом вопросе, просто сделает ваш код негибкой в случае, если необходимо использовать другую реализацию GeomObject, которая не является Triangle.

Подробнее:


Я думал, что n2.compareTo(n1) будет работать, потому что он назвал бы Object#compareTo метод

Это неверно, поскольку Object класс не имеет метода compareTo.

С другой стороны, n1.compareTo(n2) не будет работать, так как вы пропускание Object методы compareTo когда Integer#compareTo получает другой тип Integer класса.

Обратите внимание, что при объявлении этого:

Object n2 = new Integer(4); 
  • Тип переменной будет Object, независимо от того, если вы инициализировать его как Integer или другого класса, например String.
  • только Перегруженные методы будут вести себя, как это определено в эталонном объект типа времени работы, это означает, что если ваша n2 переменная держит Integer, только методы переопределены в классе Integer из класса Object будет вести себя, как это определено в Integer классе, все другие методы, поля, даже сама переменная будет вести себя как Object. В случае класса Integer эти методы: equals, hashCode и toString.
  • Ссылка, приведенная выше: Что означает «программировать интерфейс»? объясняет преимущества использования интерфейса (или абстрактного класса или общего класса) для обобщения работы через общие интерфейсы/классы вместо прямой реализации. Обратите внимание, что бывают случаи, когда такой подход не применяется, например. ваш текущий пример, используя Object, когда вы должны использовать Integer. Обратите внимание, что Object класс тоже общий (по крайней мере, для этого случая), поэтому я не буду рекомендовать использовать Object, по крайней мере, потому, что вы понимаете, что вы действительно делаете.
+0

добавил к оригинальному вопросу * – xheyhenry

+0

@xheyhenry, пожалуйста, отредактируйте свой вопрос соответственно и ** добавьте * (не удаляйте ничего) новую часть вопроса, затем я отредактирую свой ответ. –

+0

@xheyhenry ответ обновлен. –

Смежные вопросы