2015-04-08 3 views
0

Я знаю, что конструкторы не наследуются в java, и мы должны неявно или явно вызывать их и переменные частного экземпляра, доступные только в объявлении класса. предположим, что у нас есть суперкласс с одной частной переменной экземпляра и инициализируем его конструктора суперкласса , напримерконструктор и наследование в java

 public class SuperClass 

     { 

      private int a; 

      public SuperClass (int a) 
      { 

      this.a = a; 

      } 
      . 
      . 
      . 
     } 

и наш подкласс, как это

public class SubClass extends SuperClass 

    { 

     public int b; 


     public SubClass (int a, int b) 
     { 

     super(a); 
     this.b = b; 

     } 
     . 
     . 
     . 
    } 

так здесь public SubClass (int a, int b) нет никаких проблем, даже один из его аргументов является частным и принадлежит SuperClass ??? если да, как можно получить доступ к переменной private через другой класс ???

+0

Если вы не заметили ни одного кода, который вы написали, кроме 'this.a = a;', фактически затрагивает частный 'a'. Параметры не совпадают с экземпляром. – ChiefTwoPencils

+0

Переменная «a» в SubClass не совпадает с переменной экземпляра в SuperClass, они не имеют отношения друг к другу – MadProgrammer

ответ

1

Когда вы вызываете super(a);, вы не получаете доступ к суперклассу из подкласса. Вы вызываете конструктор суперкласса, который, в свою очередь, обращается к своей собственной переменной. Это совершенно справедливо и логично.

Кроме того, все переменные и функции суперкласса наследуются подклассом, так что подкласс может получить доступ к переменным суперкласса. Обратите внимание, что вы не можете получить к нему доступ напрямую, если он является приватным, но это не означает, что подкласс не наследует поле.

Рассмотрим следующие классы:

public class A { 
    private int a = 5; 

    public int getA() { 
     return a; 
    } 
} 

и

public class B extends A { 
    public int getnumber() { 
     return this.getA(); 
    } 
} 

Если бы я это сделать:

B x = new B(); 

затем

System.out.println(x.a); //invalid 

Это недействительно. Вы не можете напрямую обращаться к полю a внутри объекта B, но даже если вы его не видите, он все еще существует. Мы можем утверждать, что, делая это:

System.out.println(x.getnumber()); 

, которая печатает 5.

+0

даже личные переменные, унаследованные ??? –

+0

Унаследовано, но недоступно, как вы думаете. Я приведу пример в ответ. – Aify

0
public SubClass (int a, int b) { 

    super(a); 
    this.b = b; 

    } 

int a новая переменная, отличается от private int a decalred в SuperClass. Когда вы вызываете super(a), вы передаете значение внутри переменной параметра int a в конструктор суперкласса. Это сохраняется в private int a

0

так что здесь общественное SubClass (Int А, внутр б) нет никаких проблем, даже один из его аргументов является частным и принадлежит SuperClass ??? если да, то как можно получить доступ к частной переменной экземпляра через другой класс ???

Объем этих параметров в этом конструкторе ограничен этим кодовым блоком. int a и int b никоим образом не связаны с переменными уровня класса, их просто называют одинаковыми.

Возможно, вы должны сделать публичный getter для переменной, но вы также можете просто объявить переменную как «защищенную» (доступную для других классов в одном пакете и подклассах) или «общедоступную» - доступную всем ,

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