问题描述
我想也许没有办法做到这一点,但我认为值得一提。 我想做类似以下的事情:
public class Super {
public static String print() { System.out.println(new Super().getClass().getSimpleName()); }
public Super() {}
}
public class Subclass extends Super {
public Subclass() {}
public void main(String[] args) {
Super.print();
Subclass.print();
}
}
我的希望是让Super.print()显示“Super”和Subclass.print()来显示“Subclass”。 但是,我不知道如何从静态上下文中执行此操作。 谢谢您的帮助。
我很清楚我可以在没有静态方法的情况下执行此操作,并且可以将类传递给每个方法调用。 我不想这样做,因为这需要在许多子类上重新定义几个静态方法。
1楼
您只需使用所需的实现定义一个单独的Subclass.print()
方法即可。
静态方法是类作用域的,因此每个子类都可以有自己的实现。
public class Subclass {
public Subclass() {}
public static String print() {
System.out.println(Subclass.class.getSimpleName());
}
public void main(String[] args) {
Super.print();
Subclass.print();
}
}
请注意,您的代码可以稍微简化 - Super.class
足以代替new Super().getClass()
。
另请注意,静态方法不是多态的Super.print()
和Subclass.print()
将始终在相应的类中调用该方法。
这就是为什么它们被绑定到一个类,而不是一个对象。
如果您有一个大的类层次结构,那么通过在每个层次结构中实现单独的静态print()
,您可能会得到大量重复的代码。
相反,您可以定义一个非静态方法来完成工作:
public abstract class Super {
public final String print() {
System.out.println(this.getClass().getSimpleName());
}
...
}
请注意,此方法甚至不需要是多态的 - this.getClass()
将始终返回实际的子类标记。
另请注意,我将Super
声明为abstract
- 这是(几乎总是)遵循基类的好习惯。
2楼
您可以使用静态方法完成此操作
public class Parent {
public print(){
System.err.println(this.getSimpleName());
}
}
public class Child extends Parent {
public void main(String[] args) {
Parent p = new Parent();
p.print();
Child c = new Child();
c.print();
}
}