在Java中如何引用子类变量而不在父类中声明该变量?

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

class A {
    private final int x = 5;

    protected int getX() {
        return x;
    }

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

class B extends A {
    private final int x = 10;

    @Override
    protected int getX() {
        return x;
    }


}

在这个例子中,我需要在父类中打印子类值.
它工作正常.没有任何问题.
现在打印10.
但我不想在父类A中定义该属性.

因为在这个例子中这个x数据类型非常简单.所以没问题.
但实时我想使用其他数据类型,可能是另一个类变量或List< something>哪些都有巨大的数据.

所以最终我不希望将这个值存储在A类中.
因为它是冗余数据.它会在我的Hibernate中减慢速度.
请告诉我,如何在不在父类中声明变量的情况下实现此目的.但是我仍然需要在父类中使用子类变量.

解决方法:

使抽象你的A类和getX();方法.

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

abstract class A {

    protected abstract int getX();

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

class B extends A {
    private final int x = 10;

    @Override
    protected int getX() {
        return x;
    }
}

并覆盖toString方法来代替print方法

@Override
public String toString() {
    return String.valueOf(getX());
}

最后的代码

public class Test {
    public static void main(final String[] args) {
        B b = new B();
        System.out.println(b);
    }
}

abstract class A {

    protected abstract int getX();

    @Override
    public String toString() {
        return String.valueOf(getX());
    }
}

class B extends A {
    private static final int X = 10;

    @Override
    protected int getX() {
        return X;
    }
}

你也可以将你的x变量定义为静态

但正如安德鲁Tobilko所说,如果A不代表有状态实体,你也可以考虑使用接口.

它肯定是适用于您的情况的最佳解决方案,混合使用接口和抽象类

public class Test {
    public static void main(final String[] args) {
        B b = new B();
        System.out.println(b);
    }
}

interface MyInterface {
    int getX();
}

abstract class A implements MyInterface{
    @Override
    public String toString() {
        return String.valueOf(getX());
    }
}

class B extends A {
    private static final int X = 10;

    @Override
    public int getX() {
        return X;
    }
}
上一篇:C#接口,多态性和代理


下一篇:在Javascript中反序列化多态JSON