我试图理解我在Java中的多态性。我创建了一个父类,它有太多常用方法,所有孩子都会以相同的方式使用它们。
每个子类的子节点都共享静态信息,这些变量或信息将在仅在父节点中声明的方法中使用。
希望从Parent方法访问静态变量的问题似乎不太可能,
它是一个声明每个实例的公共信息的解决方案,但由于将有1000个实例,这样浪费了内存。
我的意思的简单阐述是以下代码:
class testParent {
static int k;
public void print()
{
System.out.println(k);
}
}
class testChild2 extends testParent
{
static
{
testChild2.k =2;
}
}
public class testChild1 extends testParent{
static
{
testChild1.k = 1;
}
public static void main(String[] args)
{
new testChild1().print();
new testChild2().print();
new testChild1().print();
}
}
我期望的输出是
1
2
1.
但是会发生什么:
1
2
2
有人可能会认为,在每个子类的启动时,会设置此子类的静态变量,然后引用此子类的所有方法都可以访问相应的“k”值。
但实际发生的是,所有子类都在同一个静态变量中编辑,这个静态变量在所有子类中共享,因此破坏了我为每个子类及其实例使用静态变量的整个观点,并使用Parent中的commmon方法访问这些变量
任何想法如何做到这一点?
答案 0 :(得分:4)
一个选项是通过抽象(非静态)方法访问子类的静态数据:
abstract public class Parent {
protected abstract int getK();
public void print() {
System.out.println(getK());
}
}
public class Child1 extends Parent {
private static final int CHILD1_K = 1;
protected int getK() { return CHILD1_K; }
}
public class Child2 extends Parent {
private static final int CHILD2_K = 2;
protected int getK() { return CHILD2_K; }
}
答案 1 :(得分:1)
当你创建新的testChild2()。print(); testChield2上的静态块已执行,并将值更改为2。
静态块仅在ClassLoader加载时执行一次。
这个给出你想要的输出:
class testParent {
static int k;
public void print()
{
System.out.println(k);
}
}
class testChild2 extends testParent
{
{
testChild2.k =2;
}
}
public class testChild1 extends testParent{
{
testChild1.k = 1;
}
public static void main(String[] args)
{
new testChild1().print();
new testChild2().print();
new testChild1().print();
}
}
非静态代码块每次实例化时都会执行。
答案 2 :(得分:1)
静态变量特定于类本身。如果希望类的不同实例中的相同字段具有不同的值,则该字段不能是静态的。
解决方案:不要使k
静态。
class testParent {
int k;
public void print()
{
System.out.println(k);
}
}
class testChild2 extends testParent
{
{
this.k =2;
}
}
class testChild1 extends testParent{
{
this.k = 1;
}
public static void main(String[] args){
new testChild1().print();
new testChild2().print();
new testChild1().print();
}
}
的 Demo 强>
(忽略static class
业务 - 这只是为了让它在ideone中工作。)
答案 3 :(得分:1)
过早优化是万恶之源。我不认为你会遇到成千上万个实例的任何内存问题,每个实例都有自己的数据,除非你正在开发某种小型的嵌入式系统。静态变量不是为了做你想做的事情。