Java8:最好扩展静态方法类,还是直接调用静态方法更好?

Java8:最好扩展静态方法类,还是直接调用静态方法更好?,java,inheritance,memory,java-8,static-methods,Java,Inheritance,Memory,Java 8,Static Methods,我正在将一些旧的Java4代码更新为Java8(这里粘贴的内容太多了),最初的程序员选择让他们的几乎每个类都扩展这个只有静态方法和常量的巨大类,但我不知道他们的推理 例: 我的问题是。。。是保留这种设计更好,还是删除静态方法/常量的继承并简单地静态调用这些方法/常量更好 “更好”对我来说是指更低的内存消耗(同样,这个基类相当大),因为CPU可能不会受到影响。这种方法的优点/缺点是什么 我担心的是,因为基类太大了,我在继承类中只使用了一个或两个方法/常量而浪费了大量内存,我可以静态调用这些方法/常

我正在将一些旧的Java4代码更新为Java8(这里粘贴的内容太多了),最初的程序员选择让他们的几乎每个类都扩展这个只有静态方法和常量的巨大类,但我不知道他们的推理

例:

我的问题是。。。是保留这种设计更好,还是删除静态方法/常量的继承并简单地静态调用这些方法/常量更好

“更好”对我来说是指更低的内存消耗(同样,这个基类相当大),因为CPU可能不会受到影响。这种方法的优点/缺点是什么

我担心的是,因为基类太大了,我在继承类中只使用了一个或两个方法/常量而浪费了大量内存,我可以静态调用这些方法/常量。

静态成员本身并不是“继承的”。无论从哪个子类调用它们,它们都生活在基类上,因此我怀疑是否有任何内存影响

将所有类创建为该公共类的子类的原因只是为了在没有限定类名的情况下轻松访问静态成员。一个常见的变体是从声明一组静态字段的接口继承。好处是实现接口不会像超类那样干扰继承(您只能扩展单个超类)。缺点是,在Java8之前,不可能在接口上声明静态方法


在任何情况下,此技巧通常被视为反模式,并已被取代。

继承是为子类自定义父类的行为

静态方法不能被继承,并且它们的行为不会因对象的状态而改变


所以你不能让某些东西是静态的和可继承的。扩展一类完全静态的方法是没有意义的。而且,这不会改变内存使用量的大小。您的类已加载

会员们在上面写了许多美丽的见解。如果有助于理解,我想用不同的词来表达

继承: 父类的所有成员变量和函数都包含在基于可见性运算符(public、private、protected)的子类中

静态成员: 类的静态成员存储在类的所有实例变量都可以访问的内存中。它就像是一个共享的空间,用于所有属于该类的实例变量


现在谈到静态变量和函数的继承,建议使用静态导入

这是一个反模式的原因还有很多,但这个答案基本上是正确的:这是一个非常糟糕的做法,应该撤销。一个主要原因是它将每个类耦合到静态方法超类。这些类中没有一个可以扩展任何其他类。问题是关于Java 4代码的,Java 5中引入了静态导入,这一事实解释了动机(即使在Java 5为便于导入而进行子类化之前,也被认为是一种反模式)。尽管如此,还是值得考虑将庞大的类拆分为几个较小的类,或者按主题将实用程序方法分开,因为当使用静态导入而不是继承时,Java的单一继承不再是一个问题。
public class BaseClass{
     /* this class has a huge amount of ONLY static methods/constants */

     public static final int STUFF_DONE = 1;

     public static String getStuff(){
           String stuff = "this is my stuff.";
           return stuff;
     }
     ...
}

public class SuperClass extends BaseClass{
     /* this class has only a few methods */
     public String labelStuff(){
          return getStuff();
     }
}

public class MyClass extends SuperClass{
     /* there are many classes that extend SuperClass like this one */
     public int handleStuff(){
          String myString = labelStuff();
          return STUFF_DONE;
     }
     public static void main(){
          if(handleStuff()) System.out.println("Done.");
     }
}