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;
}
}