Java 何时使用静态方法

Java 何时使用静态方法,java,static-methods,Java,Static Methods,我想知道什么时候使用静态方法?假设我有一个包含几个getter和setter的类,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法 例如: Obj x = new Obj(); x.someMethod(); public class Demo { public static void main(String... args) { Demo d = new Demo(); System.out.println("Th

我想知道什么时候使用静态方法?假设我有一个包含几个getter和setter的类,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法

例如:

Obj x = new Obj();
x.someMethod();
public class Demo
{
   public static void main(String... args) 
   {
      Demo d = new Demo();

      System.out.println("This static method is executed by JVM");

     //Now to call the static method Displ() you can use the below methods:
           Displ(); //By method name itself    
      Demo.Displ(); //By using class name//Recommended
         d.Displ(); //By using instance //Not recommended
   }

   public static void Displ()
   {
      System.out.println("This static method needs to be called explicitly");
   }
} 
…或:

Obj.someMethod(); // Is this the static way?

我很困惑

java中的静态方法属于类(而不是它的实例)。它们不使用实例变量,通常从参数中获取输入,对其执行操作,然后返回一些结果。实例方法与对象关联,顾名思义,可以使用实例变量。

否,静态方法与实例不关联;他们属于这个班。静态方法是你的第二个例子;实例方法是第一种方法。

如果希望在没有类实例的情况下访问该方法,请使用静态方法。

静态:
Obj.someMethod


当您希望提供对方法的类级访问时,请使用
static
,即在没有类实例的情况下应该可以调用该方法。

静态方法与实例不关联,因此它们无法访问类中的任何非静态字段

如果静态方法不使用类的任何字段(或仅使用静态字段),则将使用该方法


如果使用类的任何非静态字段,则必须使用非静态方法。

一条经验法则:问问自己“即使尚未构造对象,调用此方法是否有意义?”如果是这样,它肯定应该是静态的

因此,在类
Car
中,您可能有一个方法:

double convertMpgToKpl(double mpg)
…这将是静态的,因为人们可能想知道35mpg转换成什么,即使没有人制造过
汽车
。但是这种方法(设置一辆特定
汽车的效率)

…不能是静态的,因为在任何
Car
构建之前调用该方法是不可想象的

(顺便说一句,反过来并不总是正确的:您有时可能有一个方法涉及两个
Car
对象,但仍然希望它是静态的。例如:

Car theMoreEfficientOf(Car c1, Car c2)

虽然可以将其转换为非静态版本,但有些人会认为,由于没有“特权”选择哪个
Car
更重要,你不应该强迫调用者选择一个
Car
作为你调用方法的对象。不过,这种情况只占所有静态方法的一小部分。

在阅读了Misko的文章后,我认为从测试的角度来看是不好的。你应该让我nstead(可能使用依赖项注入工具,如)

如何确保我只拥有其中一项 只有一件东西 “我如何确保我 “只有一个”是很好的 回避。您只实例化了一个 您的应用程序中的单个应用程序工厂 主要的,因此,你只有 实例化所有对象的单个实例 你的单身汉

静态方法的基本问题是它们是过程代码 静态方法的基本问题是 它们是程序代码,我没有 了解如何对过程代码进行单元测试。 单元测试假设我可以 实例化我的应用程序的一部分 在实例化过程中 我将依赖项与 取代游戏的模拟/友谊赛 真正的依赖关系。与程序 编程无需“连线” 因为没有对象,所以代码 数据是分开的


静态方法不需要在对象上调用,也就是在您使用它时。例如:您的Main()是静态的,您不需要创建对象来调用它。

仅在以下场景中定义静态方法:

  • 如果您正在编写实用程序类,并且不应该更改它们
  • 如果该方法未使用任何实例变量
  • 如果任何操作不依赖于实例创建
  • 如果有一些代码可以很容易地被所有实例方法共享,那么将这些代码提取到一个静态方法中
  • 如果您确信该方法的定义将永远不会更改或重写。因为无法重写静态方法

  • 静态方法和变量是Java中“全局”函数和变量的受控版本。在这些函数和变量中,可以通过
    classname.methodName()
    classInstanceName.methodName()
    访问方法,也就是说,可以使用类名和类实例访问静态方法和变量


    类不能声明为静态(因为它没有意义。如果类声明为公共的,则可以从任何地方访问),内部类可以声明为静态。

    实际上,我们在类中使用静态属性和方法,当我们想使用程序的某个部分时,它应该一直存在,直到程序运行。我们知道,要操作静态属性,我们需要静态方法,因为它们不是实例变量的一部分。如果没有静态方法,我们可以操作静态属性非常耗时。

    使用静态方法有一些合理的理由:

    • 性能:如果您希望运行某些代码,而不想实例化额外的对象来执行此操作,请将其放入静态方法中。JVM还可以大量优化静态方法(我想我曾经读过James Gosling,他宣称JVM中不需要自定义指令,因为静态方法同样快,但找不到源代码——因此可能是完全错误的)是的,这是微观优化,可能是不必要的。我们程序员从来不会因为他们很酷就做不必要的事情,对吧

    • 实用性:使用静态导入调用
      Util.method(arg)
      ,而不是调用
      new Util().method(arg)
      ,或者
      method(arg)
      。更简单、更短

    • 添加方法:您确实希望类字符串
       class Languages 
       {
           public static void main(String[] args) 
           {
               display();
           }
      
           static void display() 
           {
               System.out.println("Java is my favorite programming language.");
           }
        }
      
      class Student9{  
       int rollno;  
       String name;  
       static String college = "ITS";  
      
       static void change(){  
       college = "BBDIT";  
       }  
      
       Student9(int r, String n){  
       rollno = r;  
       name = n;  
       }  
      
       void display (){System.out.println(rollno+" "+name+" "+college);}  
      
      public static void main(String args[]){  
      Student9.change();  
      
      Student9 s1 = new Student9 (111,"Indian");  
      Student9 s2 = new Student9 (222,"American");  
      Student9 s3 = new Student9 (333,"China");  
      
      s1.display();  
      s2.display();  
      s3.display();  
      }  }
      
      1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
      2. ABCClass.convertFarenheitToCelcium(double farenheit)
      
      Math.random()
      Math.sqrt(double)
      Math.min(int, int)
      StringUtils.isEmpty(String)
      StringUtils.isBlank(String)
      
      new MockUp<ClassName>() {
          @Mock
          public int doSomething(Input input1, Input input2){
              return returnValue;
          }
      };
      
      public static int min(int a, int b) {
          return (a <= b) ? a : b;
      }
      
      public class Demo
      {
         public static void main(String... args) 
         {
            Demo d = new Demo();
      
            System.out.println("This static method is executed by JVM");
      
           //Now to call the static method Displ() you can use the below methods:
                 Displ(); //By method name itself    
            Demo.Displ(); //By using class name//Recommended
               d.Displ(); //By using instance //Not recommended
         }
      
         public static void Displ()
         {
            System.out.println("This static method needs to be called explicitly");
         }
      }