Подтвердить что ты не робот

Java: использование метода родительского класса для доступа к переменной дочернего класса

У меня есть следующий сценарий:

public class A {

    private int x = 5;

    public void print()
    {
        System.out.println(x);
    }
}


public class B extends A {

    private int x = 10;

    /*public void print()
    {
        System.out.println(x);      
    }*/

    public static void main(String[] args) {
        B b = new B();
        b.print();
    }

}

При выполнении кода выход: 5.

Как получить доступ к переменной дочернего класса (B) (x) с помощью метода родительского класса?

Может ли это сделать без переопределить метод print() (например, раскомментировать его в B)?

[Это важно, потому что при переопределении нам придется снова переписать весь код для метода print()]

EDITED

Дополнительная информация: -

  • Мотивом вопроса является использование значения частной переменной дочернего класса из метода родительского класса. Это не требует изменения значения частной переменной родительского класса для достижения желаемого результата.
  • Ответы, размещенные здесь, привели меня к моему желаемому ответу, который я опубликовал ниже.

(Спасибо всем за ваше время и помощь)

4b9b3361

Ответ 1

class A {
    private int x = 5;

    protected int getX() {
        return x;
    }

    protected void setX(int x) {
        this.x = x;
    }

    public void print() {
        // getX() is used such that 
        // subclass overriding getX() can be reflected in print();
        System.out.println(getX());
    }
}

class B extends A {
    public B() {
        // setX(10);  // perhaps set the X to 10 in constructor or in main
    }

    public static void main(String[] args) {
        B b = new B();
        b.setX(10);
        b.print();
    }
}

EDITED

Ниже приведен общий ответ с использованием абстрактного класса и метода для решения аналогичного сценария:

abstract class SuperA {
    protected abstract Object getObj();

    public void print() {
        System.out.println(getObj());
    }
}

class A extends SuperA {
    @Override
    protected Object getObj() {
        // Your implementation
        return null; // return what you want
    }
}

class B extends A {
    @Override
    protected Object getObj() {
        // Your implementation
        return null; // return what you want
    }

    public static void main(String[] args) {
        B b = new B();
        b.print();
    }
}

Ответ 2

Прочитав все ответы, размещенные здесь, я получил то, что искал. Следующее - это то, что я считаю лучшим ответом на мой вопрос:

public class A {
    private int x = 5;    
    protected int getX(){
        return x; 
    }    
    public void print(){
        System.out.println(getX());
    }
}
public class B extends A {
    private int x = 10;
    protected int getX(){
        return x; 
    }  
    public static void main(String[] args) {
        B b = new B();
        b.print();
    }
}

Настройка защищенного геттера и его переопределение лучше, чем переопределение метода print(), поскольку вместо метода печати может быть любой другой огромный метод, которому может потребоваться доступ к значению переменной дочернего класса (s).

Ответ 3

Чтобы решить свой вопрос, вы должны определить поля в родительском классе A, как и защищенные (поэтому он будет унаследован от дочернего класса) и установить значение поля x внутри конструктора в дочернем классе B. Метод печати также унаследован от класса A, поэтому вы можете вызвать его непосредственно из родительского класса.

Надеюсь, это поможет вам.

public class A 
{
    // fields declaration 
    protected int x = 5;

    public void print()
    {
        System.out.println(x);
    }
}



public class B extends A 
{

    public B()
    {
        // set child x value. The field have been defined in the parent class
        x = 10;
    }

    public static void main(String[] args) 
    {
        A a = new A();
        a.print(); // print 5

        B b = new B();
        b.print(); // print 10
    }

}

Ответ 4

Вы должны выставить getter для требуемого значения и переопределить это в дочернем классе.

Так же:

public class A {

    private int x = 5;

    public void print()
    {
        System.out.println(getX());
    }

    protected void setX(int x)
    {
        this.x = x;
    }

    protected int getX()
    {
        return x;
    }

}


public class B extends A {

    /*public void print()
    {
        System.out.println(x);      
    }*/

    public B()
    {
        setX(10);
    }

    public static void main(String[] args) {
        B b = new B();
        b.print();
    }

}

Ответ 5

Вы всегда можете добавить его в конструктор:

public class B extends A {

    //this line is unnecessary: private int x = 10;

    /*public void print()
    {
        System.out.println(x);      
    }*/

    public B()
    {
        x=10;
    }


    public static void main(String[] args) {
        B b = new B();
        b.print();
    }

}

Причина, по которой она не будет работать, когда вы пытаетесь это сделать, - это то, что значения по умолчанию оцениваются только один раз. Поэтому, когда он по умолчанию 5 в A, он остается 5, даже если вы использовали по умолчанию 10 в B.