Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Основы Java


Автор: vanam 26.3.2015, 11:55
Изучаю Java. Однако не могу освоить самого простого - создание объектов.
Для примера:

Код

class Shape{
    int square=5;
    Shape(){System.out.println("Shape constructor");};
    void draw(){System.out.println("Shape draw()");};
}

class Circle extends Shape{
    int radius=5;
    Circle(){System.out.println("Circle constructor");};
    void clear(){};
    void draw(){System.out.println("Circle draw()");};    
}

public class test {

    public static void main(String[] args) {
        Shape s=new Circle();
        s.draw();
        System.out.println(s);
    }


Shape s=new Circle(); - s будет ссылкой на какой объект?
•    new Circle() – создаст и инициализирует объект Circle, то есть фактически выделит память под int square и int radius и инициализирует их значениями «5».
•    s – будет содержать ссылку на вновь созданный объект, то есть на область памяти с данными (полями). А значит s ссылка на объект Circle.
•    Shape s – указывает, что s ссылка на объект типа Shape. Соответственно и методы доступны только базового класса. А значит s ссылка на объект Shape.
•    s.draw() – отрабатывает метод класса Circle. А значит s - объект с полями Circle, доступными методами Shape, но отрабатывают методы Circle.

Автор: sgrey 26.3.2015, 22:49
судя по коду проблема с наследованием, а не созданием объектов. Материалов и статей про наследование полно, а также все учебники его описывают

Автор: Pawl 27.3.2015, 07:26
Цитата

   А значит s - объект с полями Circle, доступными методами Shape, но отрабатывают методы Circle.
   

Это называется "механизм позднего связывания":
Цитата

   Механизм «позднего связывания» в процессе выполнения программы определяет принадлежность объекта конкретному классу и производит вызов метода, относящегося к классу, объект которого был использован. Механизм «позднего связывания» позволяет определять версию полиморфного (виртуального) метода во время выполнения программы. Другими словами, иногда невозможно на этапе компиляции определить, какая версия переопределенного метода будет вызвана на этапе выполнения программы.
   Краеугольным камнем наследования и полиморфизма предстает следующая
   парадигма: «объект подкласса может использоваться всюду, где используется объект суперкласса». То есть при добавлении к иерархии классов нового подкласса существующий код с экземпляром нового подкласса будет работать точно так же, как и со всеми другими экземплярами классов в иерархии.
   При вызове метода сначала он ищется в самом классе. Если метод существует, то он вызывается. Если же метод в текущем классе отсутствует, то обращение происходит к родительскому классу и вызываемый метод ищется в этом классе. Если поиск неудачен, то он продолжается вверх по иерархическому дереву вплоть до корня (верхнего класса Object) иерархии.
   


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Osnovy-Java-id5513c9e0ae2015d2158b4567#findElement_E7045_5514dbf0ae20154a0f225e3c_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)