Как получить доступ к закрытым переменным класса в его подклассе? - PullRequest
19 голосов
/ 13 февраля 2010

Это вопрос, который мне задали в интервью: у меня есть класс A с частными членами, а класс B - с расширением A. Я знаю, что к закрытым членам класса нельзя получить доступ, но вопрос таков: мне нужен доступ к частным членам класс A из класса B, а не создавать переменные с одинаковым значением в классе B.

Ответы [ 28 ]

1 голос
/ 13 февраля 2010

Вы можете использовать сеттеры и геттеры класса А. Это создает такое же ощущение, как если бы вы использовали объект класса А.

1 голос
/ 30 июня 2014
  • Закрытые члены не могут быть доступны в производном классе
  • Если вы хотите получить доступ, значит, вы можете использовать методы получения и установки.
class A
{
 private int a;
 void setA(int a)
 {
    this.a=a;
 }
 int getA()
 {
   return a;
 }
}

Class B extends A
{
 public static void main(String[] arg)
  {
     B obj= new B();
     obj.setA(10);
     System.out.println("The value of A is:"+obj.getA());
  } 
}
0 голосов
/ 14 ноября 2014

Вы можете изменить его на защищенный.Пожалуйста, обратитесь к этому

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

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

private void getPropertiesFromPrivateClass(){

    Field[] privateVariablesArray = PrivateClassName.getClass().getDeclaredFields();
    Set<String> propertySet = new HashSet<String>();
    Object propertyValue;
    if(privateVariablesArray.length >0){
        for(Field propertyVariable :privateVariablesArray){
            try {

                if (propertyVariable.getType() == String.class){
                    propertyVariable.setAccessible(true);
                    propertyValue = propertyVariable.get(envtHelper);
                    System.out.println("propertyValue");
                }
            } catch (IllegalArgumentException illegalArgumentException) {
                illegalArgumentException.printStackTrace();

            } catch (IllegalAccessException illegalAccessException) {
                illegalAccessException.printStackTrace();

            }
        }

Надеюсь, это поможет вам.Счастливого обучения:)

0 голосов
/ 14 ноября 2014

Используя метод установки, вы можете использовать другое с помощью рефлексии, вы можете использовать приватный член класса, установив, что этот член скажет - взять из класса и установите a.setAccessible (true);

0 голосов
/ 19 августа 2014

Вы можете использовать Accessors (метод получения и установки) в вашем коде.

0 голосов
/ 11 июня 2014

Способы доступа к закрытым членам суперкласса в подклассе:

  1. Если вы хотите получить доступ к пакету, просто измените закрытые поля на защищенные. Это разрешает доступ к тому же подклассу пакета.
  2. Если у вас есть личные поля, просто предоставьте некоторые методы доступа (методы получения), и вы сможете получить к ним доступ в своем подклассе.
  3. Вы также можете использовать внутренний класс, например,

    public class PrivateInnerClassAccess {
    private int value=20;
    
    class InnerClass {
    
    public void accessPrivateFields() {
        System.out.println("Value of private field : " + value);
    }
    
    }
    
    public static void main(String arr[])
    {
        PrivateInnerClassAccess access = new PrivateInnerClassAccess();
        PrivateInnerClassAccess.InnerClass innerClass = access.new InnerClass();
        innerClass.accessPrivateFields();
    
    }
    
    }
    

    4. Вы также можете использовать Reflection, например,

     public class A {
    private int value;
    public A(int value)
    {
        this.value = value;
    }
    }
    
    public class B {
    public void accessPrivateA()throws Exception
    {
        A a = new A(10);
        Field privateFields = A.class.getDeclaredField("value");
        privateFields.setAccessible(true);
        Integer value = (Integer)privateFields.get(a);
        System.out.println("Value of private field is :"+value);
    }
    
    
    public static void main(String arr[]) throws Exception
    {
        B b = new B();
        b.accessPrivateA();
    }
    }
    
0 голосов
/ 26 июня 2014

Прямо мы не можем получить к нему доступ.но используя Setter и Getter мы можем получить доступ,

Код:

class AccessPrivate1 {    

    private int a=10; //private integer    
    private int b=15;    
    int getValueofA()    
    {    
        return this.a;    

    }    

    int getValueofB()    
    {    
        return this.b;    
    }    
}    


public class AccessPrivate{    
    public static void main(String args[])    
    {    
        AccessPrivate1 obj=new AccessPrivate1();    

        System.out.println(obj.getValueofA()); //getting the value of private integer of class AccessPrivate1    

        System.out.println(obj.getValueofB()); //getting the value of private integer of class AccessPrivate1    
    }    
}    
0 голосов
/ 14 февраля 2010

Приватный будет скрыт до тех пор, пока вы не получите правильный доступ к нему. Например, геттеры или сеттеры от программиста, написавшего Parent. Если они тоже не видны, то примите тот факт, что они просто приватны и недоступны для вас Почему именно ты хочешь это сделать ??

0 голосов
/ 11 сентября 2012

Обратите внимание, что закрытое поле суперкласса может быть доступно подклассу (например, если оба класса являются членами одного и того же класса). Тем не менее, закрытое поле никогда не наследуется по подклассу

0 голосов
/ 19 февраля 2014
    Class A
{
  private int i;

  int getValue()
    {
      return i;
  }
}
class B extends A
{
   void getvalue2()
    {
      A a1= new A();
      sop(a1.getValue());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...