Java 继承是否会影响应用程序的性能?

Java 继承是否会影响应用程序的性能?,java,performance,inheritance,kotlin,jvm,Java,Performance,Inheritance,Kotlin,Jvm,我想知道是否可以通过使用更多的超类来提高应用程序的性能。我的问题是关于Kotlin的,但我认为Java的答案是一样的 假设您有这个继承模式(右边的类是左边类的子类): A

我想知道是否可以通过使用更多的超类来提高应用程序的性能。我的问题是关于Kotlin的,但我认为Java的答案是一样的


假设您有这个继承模式(右边的类是左边类的子类):
A

表示您不需要所有子类中定义的所有内容,只需要类的属性和函数。出于一个模糊的原因,您的代码只使用Z类

我的问题很简单:如果您将代码更改为只使用类而不是Z类,代码的性能会更高吗?

提前感谢您的回答。

如果

“将代码更改为仅使用类而不是Z类”

包括构造,然后有一个简单的答案:

创建和存储属性/字段较少的对象要比创建属性较多的对象便宜,无论是在内存方面还是在初始化时间方面

除此之外,我不希望对绩效产生重大影响


也就是说,我不担心这里的性能——选择一种类型,它为您想用它做的事情提供了最好的抽象。如果您的代码不关心您正在使用的特定子类,并且不需要子类提供的任何功能,请使用更通用的类型。这样您的代码就更加灵活了。但是,如果您的代码在某个时候需要此类功能,即您必须进一步引入强制类型转换,那么您已经走得太远了。

答案是肯定的。 例如,如果调用方法z.someMethod()。热点将首先在Z类中查找该方法。如果HotSpot没有找到目标方法,它将在Z的父级中查找该方法。并继续这些步骤,直到找到目标方法。因此,如果继承链很长,则查找方法将花费更多的时间

但是,HotSpot使用一些缓存来加速该过程


如果您考虑方法调用的成本,则这些调用不受类型层次结构深度的影响。首先进行继承的开销很小(与静态方法相比),但即使是这样也可能会被jitted掉。@Hulk我问这两个问题。我的问题来自这样一个事实:我目前正在使用接口“JpaRepository”,它是Spring Data JPA中“Crudepository”的一个子类,目前,我不需要“JpaRepository”中定义的内容,那么我想知道我是否应该切换到“Crudepository”。关于这个问题的更多细节:谢谢你的回答,但我正在寻找一个一般性的答案,我假设使用“JpaRepository”而不是“crudepository”将永远不会影响我的代码的性能,足以看到差异,但我想知道在一个具有许多类和大量继承的大型应用程序上是否会出现这种情况。。。我的问题纯粹是理论上的,我不认为答案会改变我的编码习惯,但我真的想知道……我不认为这是一个实时场景。在实际情况下,我认为你不需要更多的3-4深度。即使这是您的情况,我也不认为这很容易管理,而且在这种情况下很难维护。@Hulk因此我们可以说,创建A而不是Z的实例将更有效,因为类包含的属性和方法比Z少。这就是我一直在寻找的答案,即使它完全符合逻辑,很明显现在你说了。如果你花时间修改答案,我会接受的。谢谢。@Eduardo我拒绝了你的编辑,因为虽然我同意使用组合而不是深层继承层次结构更好,但我认为这个建议与问题的主题(关于性能影响)有太多的偏离。这个查找在类加载时只执行一次。这件事太琐碎了,不能被视为开销。你是对的。在类加载和链接之后,HotSpot知道目标方法的vtable槽。调用一个虚拟方法,它只是索引一个数组,比如vtable[slot]。。。