2014-10-05 62 views
0

比方说,我有一个保护整数

public abstract class Super{ 

    protected static int BASE = 1; 

    public int foo(){ 
     //do some computation with BASE, e.g: 
     return BASE + 1; 
    } 
} 

和几个静态类从它继承:

public static abstract class Sub extends Super{ 
    //this class should keep BASE at 1 
} 

static class SubSub1 extends Sub{ 
    //this class should change BASE to 0 
    static{ 
     SubSub1.BASE = 0; 
    } 
} 

static class SubSub2 extends Sub{ 
    //this class should in effect have a BASE of 1 
} 

是的,这个失败。

问题很明显,因为SubSub1是一个静态类,所以如果要改变BASE,Super.BASE必须是静态的。

但是,如果Super.BASE是静态的,那么SubSub1.Base是Super.BASE。

我如何最好地实现我所要做的? (不,我不能让这些类不是静态的,并且假设有很多子类。)

我很感激帮助。

+9

你想达到什么目的?你为什么做这个? – 2014-10-05 19:10:34

+3

我不认为静态类是你认为他们是。任何外部类都是静态的,是默认的。静态只适用于嵌套类,其中包含对外部类的引用,除非是静态的。 – 2014-10-05 19:15:14

+2

静态类并不意味着它的所有变量都需要是静态的。使'BASE'是非静态的。 (另外,全部大写的变量名默认意味着一个常量,这不是 - 你应该命名变量'base')。或者,您可以在基类中创建一个'protected protected int getBase()'方法,然后让子类实现它。 – yshavit 2014-10-05 19:18:04

回答

0

Java中没有静态类。除了嵌套类以外,所有Java类都是隐式静态的。接口,注释和枚举总是静态的。

实际问题不同:Java中没有静态继承。一个子类不会获得静态超类字段的副本,它会得到相同的字段。无论你将它作为SubSub.BASE引用还是作为Super.BASE无关紧要,它都是Super.BASE

+3

“Java中没有静态类,所有类都是隐式静态的”< - 这两个语句相互矛盾 – yshavit 2014-10-05 19:20:25

0

实际上,“抽象保护int getBase()”并不是那么糟糕的一个想法 - 我只是没有'不像那个“抽象”的部分,因为我不得不在所有非抽象的子类中实现它。

此,在另一方面,似乎是工作,让我改变BASE只有当我需要改变:

public abstract class Super{ 

    protected int BASE = 1; 

    protected void setBase(){} 

    public int foo(){ 
     setBase(); 
     return BASE + 1; 
    } 
} 

然后:

public static abstract class Sub extends Super{ 
    //this class should keep BASE at 1 
} 

static class SubSub1 extends Sub{ 
    //this class should change BASE to 0 
    @Override 
    protected void setBase(){ 
     BASE = 0; 
    } 
} 

static class SubSub2 extends Sub{ 
    //this class should still have a BASE of 1 
} 

非常感谢,家伙。

+1

您不需要'setBase()'方法。您可以简单地将'BASE = 0;'赋值放入实例初始化程序块或构造函数中。 – Boann 2014-10-06 03:11:55

+0

一些子类有太多的构造函数。但我是白痴,我忘了初始化块可以是非静态的。谢谢。 – User1291 2014-10-06 05:40:49