编辑: 注意:这是一个面试问题而不是绩效优化流程。
请澄清我的疑问: 抽象类和接口实现有各自的优势,但实现的性能间隔更快?
public class Client {
public static void main(String[] args) {
ClsA obj = new ClsA();
obj.display();
InterfaceC obj1 = new ImplD();
obj1.display();
}
}
//我可以通过上述两种方式调用display()方法。哪一个表现更好?
public class ClsA extends AbstractB {
}
public class AbstractB {
public void display() {
System.out.println("---display---");
}
}
public interface InterfaceC {
public void display();
}
public class ImplD implements InterfaceC {
@Override
public void display() {
System.out.println("---display ImplD---");
}
}
根据我的理解,扩展任何课程都会导致较差的表现。原因是如果我们为子类创建obj JVM也为超类对象分配内存。
但是我的朋友说实现任何接口都会导致性能降低。原因是 这里(InterfaceC obj1 = new ImplD();)JVM必须找到哪个是实现的类指向接口引用。因此,查找需要一段时间。但是在扩展其他类JVM时没有任何困难,因为超类和子类之间的链接只在编译时发生。
请告诉我哪一个表现更好?
答案 0 :(得分:2)
两者都没有明显更快。不要根据您对性能调整的猜测来设计您的API,这几乎肯定无关紧要;使用接口和抽象类,它们在概念上是合适的。
答案 1 :(得分:0)
在现代JRE中,它们之间的任何性能差异都将非常小,如果重要的话可能会被JIT优化掉。不,我认为在这种情况下,首先甚至没有性能差异。
一位智者曾经说过:
我们应该忘记小的效率,比如大约97%的时间:过早的优化是所有邪恶的根源