2013-09-28 7 views
1

Я пытаюсь получить представление о объектно-ориентированном программировании на Java, и у меня есть эта проблема.Как создать экземпляр объекта с полями из родительского класса?

Скажет, например, у меня есть аа родительского класс, как это:

public class Shape { 
    private int location; 
    private Color color; 
    // methods such as getLocation() and getColor() 

    public Shape(int initialLocation, Color initialColor) { 
     location = initialLocation; 
     color = initialColor; 
    } 


} 

Как мне сделать мой класс ребенка, так что я могу построить, скажем, прямоугольник с начальным адресом и начальными цветами в главный метод? Создать конструктор в классе Rectangle? Я не могу, потому что местоположение и цвет - это частные поля. Создать методы доступа к местоположению и цвету и просто указать местоположение и цвет после создания экземпляра? Думаю, но есть ли способ сделать это без аксессуаров?

public class Rectangle extends Shape { 
    public Rectangle(int initialLocation, Color initialColor) { 
     super(initialLocation, initialColor); 
    } 

} 

Я просто не могу обмотать эту фундаментальную концепцию. Любая помощь?

+1

Вы можете повторно использовать конструктор родительского класса с вызовом 'super (...)'. Или используйте сеттеры. –

+0

Почему бы «Прямоугольник» расширил «Автомобиль»? –

+0

@RohitJain Vehicle? Где? – Dukeling

ответ

4

Повторное использование Конструкторы

public class Shape { 
    private int location; 
    private Color color; 

    public Shape(int location, Color color) { 
     this.location = location; 
     this.color = color; 
    } 
    // methods such as getLocation() and getColor() 
} 

и

public class Rectangle extends Shape { 
    public Rectangle(int location, Color color /*, more */) { 
     super(location, color); 
     // more 
    } 
} 

Этот official tutorial объясняет его использование.

+0

Я отредактировал свой код на основе вашего предложения. Благодаря! –

+1

@Giga У вас еще есть вопрос? –

+0

Да, если у меня есть более длинная иерархия наследования. Например, Shape -> MovingShape -> Rectangle. Я должен создать конструктор для класса MovingShape тем же способом. Верный? –

1

Если вы хотите расширить переменные, вы можете изменить их модификаторы на protected, поэтому его можно унаследовать, в противном случае private точно так же, как они не существовали для дочернего класса.

1

Хотя вы можете определить переменные экземпляра как protected, однако это противоречит объектно-ориентированному принципу инкапсуляции. Я использовал бы геттеры и сеттеры для каждой переменной экземпляра класса Shape. Кроме того, если вы создаете конструктор в Shape, вы можете вызвать супер-конструктор в Rectangle, чтобы установить местоположение и цвет в Rectangle.

public class Rectangle extends Shape { 
    public Rectangle(int location, Color color) { 
     super(location, color); 
    } 
} 

до тех пор, пока у вас есть следующий конструктор в Shape:

public class Shape { 
    // location and color define. 

    public Shape(int location, Color color) { 
     this.location = location; 
     this.color = color; 
    } 
    // getters and setters which are public for location and color 
} 
0

Частные члены базового класса, которые только доступны на подклассы не имеют смысла! Если вы хотите их прочитать, вам понадобится хотя бы общественный или защищенный геттер. Если вы хотите написать их, вам понадобится хотя бы открытый или защищенный сеттер и/или конструктор, который их инициализирует.

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