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,然后采用多态性方法