Java 调用给定实例的静态方法

Java 调用给定实例的静态方法,java,design-patterns,inheritance,anti-patterns,Java,Design Patterns,Inheritance,Anti Patterns,其中有以下代码: //in a main method somewhere Super instance = new Sub(); instance.method(); //... public class Super { public static void method() { System.out.println("Super"); } } public class Sub extends Super { public static void m

其中有以下代码:

//in a main method somewhere
Super instance = new Sub();
instance.method();

//...
public class Super {
    public static void method() {
        System.out.println("Super");
    }
}

public class Sub extends Super {
    public static void method() {
        System.out.println("Sub");
    }
}
这将按预期打印
Super
,但我有一些代码,在给定实例的情况下,我想调用静态
Sub.method()
。一种解决办法可以是:

public class Sub extends Super {
    public static void sMethod() {
        Super.sMethod();
        System.out.println("Sub (static)");
    }
    public void method() {
        super.method();
        System.out.println("Sub (instance)");
    }
}
然而,对于非平凡的函数体(在我的例子中,我检查一个参数是否在类允许的范围内),有很多重复的代码。有没有好的设计模式来解决这个问题?反思也许会奏效,但这感觉像是最后的手段

再想一想,这样更好吗

public class Sub extends Super {
    public static void sMethod() {
        Super.sMethod();
        System.out.println("Sub (static)");
    }
    public void method() {
        Sub.sMethod();
    }
}

若你们想调用类级方法,你们不需要对象,只要把

Subclass.method()

为了阅读您的评论,我认为您需要基本的对象继承和多态性方法

public class Super {
    public  void method() {
        System.out.println("Super");
    }
}

public class Sub extends Super {
    public  void method() {
        System.out.println("Sub");
    }
}
//in a main method somewhere
Super instance = new Sub();
instance.method();
现在您知道了在运行时将执行什么方法,这就是调用多态性,它是OOP的一个主要特性

若由于某种原因,在方法声明中仍然需要和静态方法,那个么可以调用 比如说

public class SubClass extends SuperClass{

public static void method2(){
  //do Something
}

@Override
public void method(){
  Subclass.method2();
}

}

静态方法不是面向对象的。它们是在简单情况下存储类数据的便捷方法,我们都经常使用它们,但随着事情变得复杂,它们会变得笨拙甚至不可能

您可能会发现坚持原来的解决方案最容易。(至少它避免了静态方法。)但您确实询问了“良好的设计模式”,因此:

您需要的是两个类的两个实例,比如MetaSub和MetaSuper,它们具有引用Sub或Super的方法和数据。他们需要实现相同的接口(称之为Meta),这样您就可以获得数据,而不必担心实际拥有的数据。Super的所有实例都会有一个方法
getMeta
,该方法返回一个元实例,可以是MetaSub,也可以是MetaSuper,因为原始实例是否为Sub

现在非常简单。对超级对象调用
getMeta
,然后对返回的任何对象调用
方法
方法,就完成了。你调用了正确的方法

元类/接口将静态类级方法(和数据)替换为真正的OO风格的实例方法。您可以自由继承、扩展和替代

您可以根据需要对其进行扩展,为每个超级子类(甚至是不扩展超级的类)提供一个元实例。你可以有Meta2,Meta3。。。可能扩展或不扩展其他接口的接口。如果需要,您甚至可以拥有两个具有不同元对象的同一类对象。此外,元实例还可用于标记集合的内容——“此集合包含子对象”。它比使用类标识符强大得多


(所需要的只是时间。诚然,如果你正在编写新的东西,而不是扩展一个遗留系统,那么这会更有趣。)

问题是为什么你需要静态的?静态方法是类级的,没有意义,因为您没有重写。我大约98%确信,除了反射之外,没有其他方法可以做到这一点。字节码“词汇表”中没有任何东西可以说明这一点。为什么从实例调用该方法时该方法必须是静态的?这里有一个概念问题……我添加了反模式标记,因为我认为这不是一个好的对象设计实践这是我的全部问题,在一个复杂的层次结构中,我不知道调用哪个
子类
@KenY-N您将对象与类级方法混淆。。你不需要某件事的实例。。。更好的解决方案是不使用静态。。您不会继承静态方法。。。我建议删除static,然后采用多态性方法