Java:父方法访问子类的静态变量?

时间:2011-03-22 16:39:40

标签: java inheritance static polymorphism

我试图理解我在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方法访问这些变量



任何想法如何做到这一点?

4 个答案:

答案 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)

过早优化是万恶之源。我不认为你会遇到成千上万个实例的任何内存问题,每个实例都有自己的数据,除非你正在开发某种小型的嵌入式系统。静态变量不是为了做你想做的事情。