编译器不允许静态方法调用非静态方法。我理解它这样做是因为非静态方法通常最终使用实例变量。
但是有一个不使用实例变量的非静态方法有意义吗?如果我们有一个不影响或不受实例状态影响的行为,那么这种方法不应该被标记为静态的。
最佳答案
当然!假设您在 interface IMyCollection
中有。它有一个方法 boolean isMutable()
.
现在您有两个类,class MyMutableList
和 class MyImmutableList
,它们都实现了 IMyCollection
。它们中的每一个都将覆盖实例方法isMutable()
,MyMutableList
只返回true
,MyImmutableList
返回假
.
isMutable()
在两个类中都是一个实例方法,(1) 不使用实例变量,(2) 不影响实例状态。然而,由于语言的限制(不可能覆盖静态方法),这种设计是唯一实用的设计。
另外,我想澄清一个误解(正如@manouti 所做的那样):非静态方法不是实例,因为它们使用任何实例变量或影响实例状态;它们是实例方法,因为它们是这样定义的(没有 static
关键字),因此具有隐式 this
参数(在 Python 等语言中,实际上是显式的!)。
关于java - 有一个不使用实例变量的非静态方法有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31814233/