所以,我开始学习Java并且我认为它是一种很棒的编程语言,但是我已经遇到了static
关键字,根据我的理解,这确定了可以通过类(例如MyClass.main()
)访问给定的方法或成员变量,而不是仅通过对象(MyObject.main()
)。我的问题是,是否可以使某些方法只能通过类而不是通过对象访问,以便MyClass.main()
可以工作,但MyObject.main()
不会?虽然我没有尝试用这个来做任何事情,但我只是想出于好奇而知道。
在我的研究中,我无法在其他任何地方发现这个问题,但如果它在其他地方,我很乐意被指向它!
请原谅我,如果它很简单,但我已经考虑了一段时间并且无处可去。
谢谢!
答案 0 :(得分:2)
任何静态方法或成员都属于类,而非静态成员属于对象。
通过执行myObject.method()
调用静态方法(或使用静态成员)实际上与MyClass.method()
完全相同,任何适当的IDE都会建议将其更改为第二个,因为一个是实际上你在做什么,无论你使用哪两个。
现在回答实际问题:
是否可以使某些方法只能通过类而不是通过对象
来访问
不,不是我所知道的,但就像我说的那样,任何合适的IDE都会发出警告,因为它没有多大意义,它会让代码的其他读者立即暗示你正在处理静态成员。
答案 1 :(得分:1)
在Java中,你可以使用这些关键字创建一个对象。(new keyword,newInstance()方法,clone()方法,工厂方法和反序列化)当你创建一个对象时,它也可以使用类的能力,就像静态方法。
简短回答:不。
答案 2 :(得分:1)
是的,简短的回答是否定的。
但是您可以将静态成员放在专用类中,这样就不会有任何实例共享其中任何一个。
MyObject是MyClass的实例,你在MyStaticThing中汇总所有静态部分。
在实例上使用静态成员可能会产生误导,因此这是一种不好的做法
虽然可能可以访问
static
成员 从一个类实例来看,它是糟糕的形式,并被大多数人认为是 误导,因为它暗示了你的代码的读者 每个类实例的成员实例。
另一件事,不要使用静态的东西,因为你不能做抽象和替换实现来扩展你的代码。
能够在实现之间切换对于维护和测试很有用。
答案 3 :(得分:1)
是否可以使某些方法只能通过类而不是通过对象访问?
是的,确实如此。您可以通过使类不可实例化来阻止创建类的任何实例来实现此目的:声明其构造函数private
。
public final class NonInstantiable {
private NonInstantiable() {
throw new RuntimeException(
"This class shouldn't be instantiated -- not even through reflection!");
}
/* static methods here... */
}
现在,只声明类static
的任何方法是有意义的 - 它们只能通过类名调用。这样的类通常称为实用程序类。