我可以使用类的方法而不实例化这个类吗?

时间:2010-03-06 21:42:55

标签: java oop class methods instantiation

我有一个包含多种方法的类,这些方法中没有构造函数。

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

例如,我可以这样做:

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

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

NameOfClass.nameOfVariable

12 个答案:

答案 0 :(得分:27)

它被称为静态变量和静态methods。试试吧,看看它是否可以编译。

答案 1 :(得分:12)

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

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

答案 2 :(得分:6)

正如许多人所指出的:只有在方法是静态的情况下才有可能。也许一些OOP背景是有序的:一个方法应该总是属于一个类。那么在没有类实例的情况下调用方法有什么用呢?在完美的OO世界中,没有任何理由这样做。许多与静态方法有关的用例都在谈论为您的类分配某种身份。虽然这在编程领域是完全合理的,但在涉及面向对象的设计方面并不是很有说服力。

当我们在一个不完美的世界中编程时,通常会有一个“自由函数”的用例(例如,Java或C ++实现sort()的方式)。由于Java没有直接支持自由函数类,只使用静态“方法”来表达那些语义,并且类包装器提供了一个“命名空间”。您如何看待这种解决方法,如果您将其视为语言设计中的一个缺陷,那么IMO就是一个意见问题。

答案 3 :(得分:5)

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

答案 4 :(得分:2)

在大多数语言中,只有在方法是静态的情况下才能这样做。静态方法只能改变静态变量。

答案 5 :(得分:2)

  

我有一个包含多种方法的类,这些方法中没有构造函数。

如果您没有显式定义构造函数,那么您将获得编译器提供的默认构造函数。因此,如果这些方法不是静态的,请尝试以下方法:

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

答案 6 :(得分:2)

类上的方法在上下文中操作实例;它可以访问实例的成员变量。您理解这一点,因为您询问如果该方法访问其中一个变量会发生什么。

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

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

答案 7 :(得分:1)

那将是静态方法。

答案 8 :(得分: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());
}

如果你真的意味着类可以在没有创建实例的情况下执行操作,那么可以,只需将所有方法和变量设置为静态(通常这不是一个好主意,但对于某些事情来说它是完美的)。

答案 9 :(得分: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));
   }
}

答案 10 :(得分:0)

在适当的封装中,你不应该“看到”实例化时发生的事情。依赖于类缺少构造函数正在打破这种形式。我想到的类的设计是为了在以后的构造函数中添加正式的状态初始化。您与该类的“合同”只是您可以使用当前设计的方法。

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

答案 11 :(得分:0)

如果您使用的是 lombok,您可以执行以下操作:

package util;
import lombok.experimental.UtilityClass;

@UtilityClass
public class UtilFunctions {
    public static int SumOfTwoNumber(int a, int b){
        return a+b;
    }
}

在带有 @UtilityClass 注释的 UtilFunctions 类中,您可以在项目的任何位置保留要调用的所有函数。为简单起见,我创建了一个函数 SumOfTwoNumber,我想在主类中使用它。这是我在主类中调用它的方法:

import util.UtilFunctions;

public class HeadFirstJavaApplication {
    public static void main(String[] args) {
        int a = 10, b = 20;
        int sum = UtilFunctions.SumOfTwoNumber(a,b);
        System.out.println(sum);
    }
}

P.S: 不要忘记添加 lombok 依赖项才能使用它。如果是 gradle,这里是如何添加 lombok 依赖项:

dependencies {
     compileOnly 'org.projectlombok:lombok:1.18.16'
     annotationProcessor 'org.projectlombok:lombok:1.18.16'

     testCompileOnly 'org.projectlombok:lombok:1.18.16'
     testAnnotationProcessor 'org.projectlombok:lombok:1.18.16'
}