我可以使用类的方法而不实例化这个类吗?
我有一个有几个方法的类,这些方法中没有构造函数。
所以,我想知道是否可以在没有创建类实例的情况下调用类的方法。
例如,我可以这样做:
NameOfClass.doMethod(x1,x2,...,xn)
总的来说,我不明白为什么它应该是不可能的。 我只是调用一个函数来做某事(或返回一些值)。 如果可能,如果方法为类的私有变量设置值,将会发生什么。 我怎样才能达到这个值? 以同样的方式?
NameOfClass.nameOfVariable
它被称为静态变量和静态方法 。 试试吧,看看它编译。
如果方法是静态的,是的。
但是您将无法访问非静态成员。
正如许多人所指出的:只有在方法是静态的情况下才有可能。 也许一些OOP背景是有序的:一个方法应该总是属于一个类。 那么在没有类实例的情况下调用方法有什么用呢? 在完美的OO世界中,没有任何理由这样做。 许多与静态方法有关的用例都在谈论为您的类分配某种身份。 虽然这在编程领域是完全合理的,但在面向对象设计方面并不十分有说服力。
当我们在一个不完美的世界中编程时,通常会有一个用于“自由函数”的用例(例如,Java或C ++实现sort()的方式)。 由于Java没有直接支持自由函数类,只使用静态“方法”来表达那些语义,并且类包装器提供了“命名空间”。 您如何看待这种解决方法,如果您将其视为语言设计中的一个缺陷,那么IMO就是一个意见问题。
1) 是的 ,您可以使用类的方法, 而无需通过使用关键字“静态”创建该类的实例或对象。
2)如果您将方法声明为“静态”,则可以通过以下方式调用此方法:
*ClassName.MethodName()*
3)例如
class Hello { public static void print() { System.out.println("HelloStatic"); } } class MainMethod { public static void main(String args[]) { // calling static method Hello.print(); } }
4)上述程序的输出为:HelloStatic
在大多数语言中,只有在方法是静态的情况下才能这样做。 而静态方法只能改变静态变量。
我有一个有几个方法的类,这些方法中没有构造函数。
如果您没有显式定义构造函数,那么您将获得编译器提供的默认构造函数。 因此,如果这些方法不是静态的,请尝试这样:
NameOfClass x = new NameOfClass(); x.doMethod(x1,x2,...,xn);
类的方法在上下文中操作实例; 它可以访问实例的成员变量。 您理解这一点,因为您询问如果该方法访问其中一个变量会发生什么。
你可以通过问自己一个问题来理解为什么它不起作用:“数据在哪里?” 如果您没有实例,那么实例变量在哪里? 数据在哪里? 答案是,它没有地方,因此不起作用。
静态函数和静态成员变量的区别在于您可以回答有关数据位置的问题。 无论是否存在特定实例,静态变量都可用。 具体实例与特定于类的决策是您必须考虑实际想要做的事情。
那将是静态方法。
我有一个有几个方法的类,这些方法中没有构造函数。
你是说你有类似的东西:
public class X { public void foo() { } }
或者你的意思是你有类似的东西:
public class X { private X() { } public void foo() { } }
如果它是第一种方式,那么,是的,有一个构造函数,它将如下所示:
public X() { super(); }
如果它是第二种方式,那么可能有一种方法,如:
public static X createInstance() { return (new X()); }
如果你真的意味着类可以在没有创建实例的情况下执行操作,那么可以,只需将所有方法和变量设置为静态(通常这不是一个好主意,但对于某些事情来说它是完美的)。
由于qre是一个静态方法,并且无法访问封闭类的实例,因此您首先要创建一个实例,然后再访问它。 例如:
public class Foo { private int bar; public static void qre() { Foo foo = new Foo(); foo.bar = 5; System.out.println("next bar: " + (++5)); } }
在适当的封装中,你不应该“看到”实例化时发生的事情。 依赖于类缺少构造函数正在打破这种forms。 我想到的类的设计是为了在以后的构造函数中添加正式的状态初始化。 您与该类的“合同”只是您可以使用当前设计的方法。
如果您希望在没有类开销的情况下使用该方法的function,也许最好将该方法包含在现有的“客户端”类中(当然这只是“复制和粘贴”编码,并且被认为是反模式软件设计。