2010-03-06 52 views
23

我有一个有多种方法的类,这些方法中没有构造函数。我可以在没有实例化这个类的情况下使用类的方法吗?

所以,我想知道是否有可能在没有创建类的实例的情况下调用类的方法。

例如,我可以做这样的事情:

NameOfClass.doMethod(x1,x2,...,xn) 

总的来说,我不明白为什么它应该是不可能的。我只是调用一个函数来做一些事情(或者返回一些值)。如果可能的话,如果该方法为该类的私有变量设置一个值,会发生什么。我怎样才能达到这个价值?以同样的方式?

NameOfClass.nameOfVariable 

回答

12

如果方法是静态的,是的。

但是你将无法访问非静态成员。

1

这将是静态方法。

26

它被称为静态变量和静态methods。试试看看它是否编译完成。

2

在大多数语言中,只有方法是静态的时候才可以这样做。而静态方法只能改变静态变量。

0

由于qre是一个静态方法,并且无法访问封闭类的实例,因此您需要先创建一个实例并访问它。例如:

public class Foo { 
    private int bar; 

    public static void qre() { 
     Foo foo = new Foo(); 
     foo.bar = 5; 
     System.out.println("next bar: " + (++5)); 
    } 
} 
2

我有几个方法的类并没有在这些方法中没有构造函数。

如果您没有明确定义构造函数,那么您将得到由编译器提供的默认构造函数。因此,如果这些方法都不是一成不变的,试试这个:

NameOfClass x = new NameOfClass(); 
x.doMethod(x1,x2,...,xn); 
5

正如许多人所指出的:这仅仅是可能的,如果该方法是静态的。也许一些OOP背景是有序的:一种方法应该总是属于一个类。那么调用一个没有类的实例的方法有什么用?在一个完美的面向对象的世界里,不应该有任何理由这样做。很多与静态方法有关的用例都是关于为您的类指定某种类型的身份。虽然在编程世界中这是完全合理的,但在涉及面向对象的设计时,这并不令人信服。当我们在一个不完美的世界中编程时,通常会有一个用于“自由函数”的用例(例如Java或C++实现sort()的方式)。由于Java没有直接支持免费函数类,只有静态“方法”用于表达这些语义,并且提供了“名称空间”的类包装器的附加优势。你认为这个解决方法,如果你认为它是语言设计的一个缺陷,那么国际海事组织就是一个意见问题。

0

在适当的封装中,你不应该“看到”实例中发生了什么。依靠一个类的缺乏构造函数正在打破这种形式。这个类的设计我想要在以后的构造函数中添加正式的状态初始化。您与该课程的“合同”仅限于您可以使用目前设计的方法。

如果您希望在没有类别开销的情况下使用该方法的功能,那么最好将您的方法包含在现有的“客户端”类中(当然这只是“复制和粘贴”编码,并且被考虑。软件设计的反模式

1

我有一个类有几种方法 并有中 这些方法没有构造

你的意思是你有这样的:

public class X 
{ 
    public void foo() 
    { 
    } 
} 

或你的意思是你有这样的:

public class X 
{ 
    private X() 
    { 
    } 

    public void foo() 
    { 
    } 
} 

如果是拳头的方式的话,是的,有一个构造函数,它看起来就像这样:

public X() 
{ 
    super(); 
} 

如果这是第二种方式然后可能有这样的方法:

public static X createInstance() 
{ 
    return (new X()); 
} 

如果你真的意思是可以类有没有创建实例就做事情的方法,那么你可以,只是让所有的方法和变量都是静态的(通常这不是一个好主意,但对于某些事情来说它是完美的)。

2

类上的方法在上下文中运行一个实例;它有权访问实例的成员变量。你明白这一点,因为你问如果方法访问其中一个变量会发生什么。

你可以通过问自己以下问题来理解为什么它不起作用:“数据在哪里?”如果您没有实例,那么实例变量在哪里?数据在哪里?答案是它没有地方,因此不起作用。

与静态函数和静态成员变量的区别在于您可以回答关于数据位置的问题。无论是否存在特定实例,都可以使用静态变量。特定于实例的特定于类的决定是您必须考虑您实际想要做什么的决定。

3

1)YES,可以通过使用关键字“静态”使用类而不创建该类的一个实例或对象的方法。

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

相关问题