在java中,是否有一种可接受的首选方法来进行如下的
public class SomeSubclass extends SomeSuperclass {
private static int x = 3;
public SomeSubclass() {
super(x);
}
}
同样,如果我有许多从一个超类延伸的子类,并且它们之间存在一些常数,那么实现它的最佳方法是什么?在这里,您可以想象每个子类只是改变x的值和任何其他常量。
拥有大量实例变量并通过保持构造函数统一是一种好习惯吗?此外,当我意识到我的变量实际上并不是常数。将它们设置为公共静态最终会更好吗?
另外,关于构造函数:
public class Someclass extends Aclass {
public Someclass() {
super(3);
setY(9);
}
}
假设扩展超类的每个子类都对构造函数进行一次参数调用,并调用setY,这是超类中的setter方法。在构造函数中使用setter方法调用或在超类中使用构造函数是否更好,它将自动执行setY的功能
答案 0 :(得分:1)
这是我们进行面向对象编程的主要原因之一 - 对象是多态的。如果许多对象在某些属性或行为上有所不同,请将其设置为虚拟getter / setter或方法:
class SomeSubclass extends SomeSuperclass {
@Override
int getX() { return 3; }
public SomeSubclass() {
super();
}
}
abstract class SomeSuperclass {
abstract int getX();
SomeSuperclass() {
System.out.println( this.getX() );
}
}
这里可行,因为在Java中,所有方法调用(甚至来自构造函数,sic!)都是虚拟的。
通常避免从构造函数中调用可覆盖的方法(如果我们调用假定已经构造了整个对象的东西,这会导致内存和引用违规)。
在您的情况下,请考虑:继承真的是您需要的最佳机制吗?也许封装,状态或类似的东西会更好,更自然的解决方案。
我的意思是,如果你真的需要超类'构造函数中的子类的某些属性,请考虑使SomeSuperclass
成为SomeSubclass
的成员而不是继承它。
如果它更重要的话:请考虑制作第三个对象 - 一个状态 - 包含所有成员和getter,它们将存储在类的每个实例中。
在简单的场景中,只需创建static final int
并传递给超级构造函数作为参数。