我遇到问题的Java问题如下:
具有非常深的继承树有哪些潜在的效率缺点,即一大类类A,B,C等,使得B扩展A,C扩展B,D扩展C等?
具有非常浅的继承树有哪些潜在的效率缺点,即一大类类A,B,C等等,这样所有这些类都扩展了单个类Z.?
我可以看到深度继承树的唯一效率问题是,在调用最深类的构造函数时,可以在深度继承树中多次调用super。此外,如果在每个类中都覆盖了方法签名,则编译器将需要更长的时间来整理或确定覆盖哪个方法。
我可以看到浅层继承树的唯一效率问题是,没有利用继承层次结构的好处。所以扩展一个类的一堆类变得杂乱无章。
我说错了吗?或者我完全错了?还有,我缺少深度和浅层继承的其他效率缺点吗?
答案 0 :(得分:8)
真正的问题是使用的抽象级别是什么。这是影响开发人员效率的因素,这是99%的案例中最重要的事情。您对代码运行效率所做的任何假设都可能是a)没有太大的区别或b)错误或c)未来版本的JVM过时。
需要担心的最重要的CPU性能是时间复杂度,但更常见的是开发人员效率,从长远来看,这将花费您最多的成本。
我可以看到深度继承树的唯一效率问题是,在调用最深类的构造函数时,可以在深度继承树中多次调用super。
JVM支持积极的内联。在合理范围内,你调用super的次数并不重要,特别是如果你不添加没有增加值的方法。
此外,如果在每个类中都覆盖了方法签名,编译器将需要更长的时间来整理或确定覆盖哪个方法。
虽然这是事实,但编译器编译代码的时间不太可能很重要。如果你有G extends F extends E extends D extends C extends B extends A
,那么你选择的唯一的超级方法就是你添加的方法。即你添加的级别越多,就越需要在每个级别覆盖一个方法。 JIT还可以内联所有这些方法,就好像从性能的角度来看没有调用一样。
所以扩展一个类的一堆类变得杂乱无章。
这非常重要。它降低了开发人员的效率和优化代码的能力。即它可能性能较差,因为它更难以优化。