Java 我可以在不实例化这个类的情况下使用类的方法吗?

Java 我可以在不实例化这个类的情况下使用类的方法吗?,java,oop,class,methods,instantiation,Java,Oop,Class,Methods,Instantiation,我有一个包含几个方法的类,这些方法中没有构造函数 因此,我想知道是否可以在不创建类实例的情况下调用类的方法 例如,我可以这样做: NameOfClass.doMethod(x1,x2,...,xn) 总的来说,我不明白为什么这是不可能的。我只是调用一个函数来做一些事情(或者返回一些值)。如果可能的话,如果该方法为类的私有变量设置一个值,将会发生什么。我怎样才能达到这个值?以同样的方式 NameOfClass.nameOfVariable 如果方法是静态的,则为“是” 但是您将无法访问非静态成

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

因此,我想知道是否可以在不创建类实例的情况下调用类的方法

例如,我可以这样做:

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

NameOfClass.nameOfVariable

如果方法是静态的,则为“是”


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

这将是静态方法

它被称为静态变量和静态变量。只要试一下,看看它是否能编译。

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

因为qre是一个静态方法,不能访问封闭类的实例,所以您必须先创建一个实例,然后再访问它。例如:

public class Foo {
   private int bar;

   public static void qre() {
      Foo foo = new Foo();
      foo.bar = 5;
      System.out.println("next bar: " + (++5));
   }
}
我有一个包含几个方法的类,这些方法中没有构造函数

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

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

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


当我们在一个不完美的世界中编程时,经常会有一个用例来使用“自由函数”(例如java或C++实现SoRT()的方式。由于Java不直接支持自由函数,因此只使用静态“方法”的类来表达这些语义,类包装器还提供了一个“名称空间”。您对这种解决方法的看法以及如果您认为它是语言设计中的一个缺陷,这是我的看法。

在适当的封装中,您不应该“看到”实例化时发生的情况。依赖于类缺少构造函数就是破坏了这种形式。my类的设计目标是以后在构造函数中添加正式的状态初始化。您与该类的“契约”只是您可以使用当前设计的方法

如果您希望在不增加类开销的情况下使用该方法的功能,那么最好将该方法包括在现有的“客户机”类中(当然,这只是“复制粘贴”编码,被认为是软件设计的反模式)

我有一个有几种方法的类 而且,在这些函数中没有构造函数 这些方法

你是说你有这样的东西:

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

    public void foo()
    {
    }
}
或者你的意思是你有这样的东西:

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

    public void foo()
    {
    }
}
如果它是第一种方式,那么,是的,有一个构造函数,它将如下所示:

public X()
{
    super();
}
如果是第二种方法,则可能有如下方法:

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

如果你真的是说类可以有一些方法在不创建实例的情况下完成任务,那么是的,你可以让所有的方法和变量都是静态的(通常这不是一个好主意,但对于某些事情来说它是完美的)类上的方法在实例的上下文中运行;它可以访问实例的成员变量。您理解这一点,因为您询问如果该方法访问其中一个变量会发生什么

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

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

1) ,通过使用关键字“Static”,您可以使用类的方法,而无需创建该类的实例或对象

2) 如果将该方法声明为“Static”,则可以通过以下方式调用该方法:

                *ClassName.MethodName()* 
3) 例如

4) 上述程序的输出将是:HelloStatic

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

package util;
import lombok.experimental.UtilityClass;

@UtilityClass
public class UtilFunctions {
    public static int SumOfTwoNumber(int a, int b){
        return a+b;
    }
}
在这里带有@utilityplass注释的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'
}