2014-09-12 4 views
0

У меня есть следующие 3-х классов в одном пакете:доступа методы родительского класса и переменные

class Machine { 

    protected int id; 

    public Machine(int i) { 
     id = i; 
    } 

    public void start() { 
     System.out.println("Machine " + id + " starting."); 
    } 
} 

class Car extends Machine { 

    protected int id; 

    public Car(int i) { 
     super(i); 
     id = i; 
    } 

    public void start() { 
     super.start(); 
     System.out.println("Car " + id + " starting."); 
     System.out.println("I can access parent variable" + super.id); 
    } 
} 

public class Application { 

    public static void main(String[] args) { 
     Machine machine = new Machine(2); 
     Car car = new Car(3); 

     car.start(); 
     machine.start(); 
     machine = car; 
     machine.start(); 
    } 
} 

У меня есть несколько вопросов об этом сейчас. Пожалуйста, дайте мне знать, если я перестану рассуждать, и я попытаюсь перефразировать себя.

  1. Могу ли я получить доступ к методам и переменным car.super из основного класса ? Если да, то как?
  2. Когда я создаю экземпляр объекта Car, я также должен инициализировать члены класса машины , вызвав его конструктор. Имеет ли это значение , что когда я создаю новый объект автомобиля, используется общая память - это размер объекта автомобиля + размер машины объект?
  3. Когда у меня есть одна и та же переменная 'id' в обоих классах и доступ к ней с использованием объекта Car Я получаю идентификатор автомобиля, но когда у меня его есть только в классе Machine и его доступе, Я бы'. Является ли это означающим, что по сути, я переопределяю идентификатор машины. Я был в предположении, что переменные-члены нельзя переопределить, только методы могут.
+0

Вы должны прочитать некоторые учебники по тегам: наследование, полиморфизм – DeiAndrei

+0

у меня есть, но им не хватает на несколько деталей. – Shan

+0

1. Да. См .: http://docs.oracle.com/javase/tutorial/java/IandI/super.html Дополнительная информация: http://docs.oracle.com/javase/tutorial/java/IandI/override.html –

ответ

1

Доступ к элементам, защищенным защитой, предоставляется только для приобретения агрегатных классов. 2.не идея. 3.Это пример динамической привязки. Это содержит функцию opps, в которой родительский элемент должен явно указывать класс агрегата.

+0

Что если члены данных были общедоступными, ответят на 1 изменение? – Shan

0

2) Понятие супер и подклассов не существует при распределении памяти для операций. Java просматривает память, необходимую для полей и экземпляра. Он рассмотрит экземпляр Machine и выделит память для int id, а затем посмотрит на экземпляр Car, видит, что память уже выделена в родительском объекте и просто присваивает значение.

Если у вашего класса Car есть поле с пометкой number и id, тогда память будет выделена для двух полей.

проверить этот парень: Java memory usage in inheritance

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