通过类而不是对象

时间:2016-07-22 22:31:53

标签: java

所以,我开始学习Java并且我认为它是一种很棒的编程语言,但是我已经遇到了static关键字,根据我的理解,这确定了可以通过类(例如MyClass.main())访问给定的方法或成员变量,而不是仅通过对象(MyObject.main())。我的问题是,是否可以使某些方法只能通过类而不是通过对象访问,以便MyClass.main()可以工作,但MyObject.main()不会?虽然我没有尝试用这个来做任何事情,但我只是想出于好奇而知道。

在我的研究中,我无法在其他任何地方发现这个问题,但如果它在其他地方,我很乐意被指向它!

请原谅我,如果它很简单,但我已经考虑了一段时间并且无处可去。

谢谢!

4 个答案:

答案 0 :(得分:2)

任何静态方法或成员都属于,而非静态成员属于对象

通过执行myObject.method()调用静态方法(或使用静态成员)实际上与MyClass.method()完全相同,任何适当的IDE都会建议将其更改为第二个,因为一个是实际上你在做什么,无论你使用哪两个

现在回答实际问题:

  

是否可以使某些方法只能通过类而不是通过对象

来访问

不,不是我所知道的,但就像我说的那样,任何合适的IDE都会发出警告,因为它没有多大意义,它会让代码的其他读者立即暗示你正在处理静态成员。

答案 1 :(得分:1)

在Java中,你可以使用这些关键字创建一个对象。(new keyword,newInstance()方法,clone()方法,工厂方法和反序列化)当你创建一个对象时,它也可以使用类的能力,就像静态方法。

简短回答:不。

答案 2 :(得分:1)

是的,简短的回答是否定的。

但是您可以将静态成员放在专用类中,这样就不会有任何实例共享其中任何一个。

MyObject是MyClass的实例,你在MyStaticThing中汇总所有静态部分。

在实例上使用静态成员可能会产生误导,因此这是一种不好的做法

http://grepcode.com/file/repo1.maven.org/maven2/org.sonarsource.java/java-checks/3.4/org/sonar/l10n/java/rules/squid/S2209.html

  

虽然可能可以访问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的任何方法是有意义的 - 它们只能通过类名调用。这样的类通常称为实用程序类