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
Дополнительная информация: -
- Мотивом вопроса является использование значения частной переменной дочернего класса из метода родительского класса. Это не требует изменения значения частной переменной родительского класса для достижения желаемого результата.
- Ответы, размещенные здесь, привели меня к моему желаемому ответу, который я опубликовал ниже.
(Спасибо всем за ваше время и помощь)
Ответы
Ответ 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.