Подтвердить что ты не робот

В чем разница между статическим методом и нестатическим методом?

См. Фрагменты кода ниже:

Код 1

public class A {
    static int add(int i, int j) {
        return(i + j);
    }
}

public class B extends A {
    public static void main(String args[]) {
        short s = 9;
        System.out.println(add(s, 6));
    }
}

Код 2

public class A {
    int add(int i, int j) {
        return(i + j);
    }
}

public class B extends A {
    public static void main(String args[]) {
    A a = new A();
        short s = 9;
        System.out.println(a.add(s, 6));
    }
}

В чем разница между этими фрагментами кода? Оба выхода 15 в качестве ответа.

4b9b3361

Ответ 1

Статический метод принадлежит самому классу, а нестатический метод (aka instance) принадлежит каждому объекту, который генерируется из этого класса. Если ваш метод делает что-то, что не зависит от индивидуальных характеристик его класса, сделайте его статическим (это уменьшит размер программы). В противном случае она должна быть нестатической.

Пример:

class Foo {
    int i;

    public Foo(int i) { 
       this.i = i;
    }

    public static String method1() {
       return "An example string that doesn't depend on i (an instance variable)";
    }

    public int method2() {
       return this.i + 1; // Depends on i
    }
}

Вы можете вызвать статические методы следующим образом: Foo.method1(). Если вы попробуете это с помощью метода2, он не сработает. Но это будет работать: Foo bar = new Foo(1); bar.method2();

Ответ 2

Статические методы полезны, если у вас есть только один экземпляр (ситуация, обстоятельство), в котором вы собираетесь использовать этот метод, и вам не нужны несколько копий (объектов). Например, если вы пишете метод, который регистрируется на одном и только одном веб-сайте, загружает данные о погоде, а затем возвращает значения, вы можете записать его как статический, поскольку вы можете жестко закодировать все необходимые данные в методе и вы не будете иметь несколько экземпляров или копий. Затем вы можете обратиться к методу статически, используя одно из следующих действий:

MyClass.myMethod();
this.myMethod();
myMethod();

Нестатические методы используются, если вы собираетесь использовать свой метод для создания нескольких копий. Например, если вы хотите загрузить метеорологические данные из Бостона, Майами и Лос-Анджелеса, и если вы можете сделать это из своего метода без индивидуальной настройки кода для каждого отдельного местоположения, вы затем получаете доступ к методу нестатически

MyClass boston = new MyClassConstructor(); 
boston.myMethod("bostonURL");

MyClass miami = new MyClassConstructor(); 
miami.myMethod("miamiURL");

MyClass losAngeles = new MyClassConstructor();
losAngeles.myMethod("losAngelesURL");

В приведенном выше примере Java создает три отдельных объекта и ячейки памяти из того же метода, который вы можете получить индивидуально с помощью ссылки "boston", "miami" или "losAngeles". Вы не можете получить доступ к любому из вышеперечисленных статически, потому что MyClass.myMethod(); является общей ссылкой на метод, а не на отдельные объекты, созданные нестатической ссылкой.

Если вы столкнулись с ситуацией, когда способ доступа к каждому местоположению или способ возврата данных достаточно различен, вы не можете написать метод "один размер подходит всем", не перепрыгивая через множество обручей, вы можете лучше выполнить свою задачу, написав три отдельных статических метода: по одному для каждого местоположения.

Ответ 4

Обычно

static: нет необходимости создавать объект, который мы можем напрямую вызвать с помощью

ClassName.methodname()

Non Static: нам нужно создать такой объект, как

ClassName obj=new ClassName()
obj.methodname();

Ответ 5

Статический метод принадлежит классу и нестатический метод принадлежит объект класса. Это нестатический метод может быть вызван на объект класса, который он принадлежит. Статический метод может однако следует называть как класс, так и а также объект класса. статический метод может получить доступ только к статическому члены. Нестатический метод может доступ как статический, так и нестатический членов, поскольку в то время, когда статический метод, класс может не быть экземпляром (если это вызов самого класса). в в другом случае нестатический метод может вызывается только тогда, когда класс уже был создан. Статический метод разделяют все экземпляры класс. Это некоторые из основных различия. Я бы также хотел укажите часто игнорируемую разницу в данном контексте. Всякий раз, когда метод вызываемый в С++/Java/С#, неявный аргумент (ссылка 'this') проходил вместе с/без другого параметры. В случае статического метода вызов, 'this' ссылка не переданные как статические методы, принадлежат к класса и, следовательно, не имеют 'this'ссылка.

Ссылка: Статические Vs нестатические методы

Ответ 6

Ну, более технически говоря, разница между статическим методом и виртуальным методом связана с тем, как они связаны.

Традиционный "статический" метод, как и в большинстве языков не OO, привязан/подключен "статически" к его реализации во время компиляции. То есть, если вы вызываете метод Y() в программе A и связываете свою программу A с библиотекой X, которая реализует Y(), адрес X.Y() жестко привязан к A, и вы не можете изменить это.

В языках OO, таких как JAVA, "виртуальные" методы разрешаются "поздно", во время выполнения, и вам нужно предоставить экземпляр класса. Итак, в программе A, чтобы вызвать виртуальный метод Y(), вам нужно предоставить экземпляр B.Y(), например. Во время выполнения каждый раз, когда A вызывает B.Y(), вызванная реализация будет зависеть от используемого экземпляра, поэтому B.Y(), C.Y() и т.д. Могут потенциально обеспечить различные реализации Y() во время выполнения.

Зачем вам это нужно? Потому что вы можете отделить ваш код от зависимостей. Например, скажем, программа A выполняет "draw()". Со статическим языком, то есть, но с OO вы будете делать B.draw(), а фактический чертеж будет зависеть от типа объекта B, который во время выполнения может изменить квадрат круга и т.д. Таким образом, ваш код может нарисовать несколько вещей, без необходимости изменять, даже если появляются новые типы B ПОСЛЕ написания кода. Nifty -

Ответ 7

Статический метод принадлежит классу, а нестатический метод принадлежит объекту класса. Я приводил один пример, как он создает разницу между выходами.

public class DifferenceBetweenStaticAndNonStatic {

  static int count = 0;
  private int count1 = 0;

  public DifferenceBetweenStaticAndNonStatic(){
    count1 = count1+1;
  }

  public int getCount1() {
    return count1;
  }

  public void setCount1(int count1) {
    this.count1 = count1;
  }

  public static int countStaticPosition() {
    count = count+1; 
    return count;
    /*
     * one can not use non static variables in static method.so if we will
     * return count1 it will give compilation error. return count1;
     */
  }
}

public class StaticNonStaticCheck {

  public static void main(String[] args){
    for(int i=0;i<4;i++) {
      DifferenceBetweenStaticAndNonStatic p =new DifferenceBetweenStaticAndNonStatic();
      System.out.println("static count position is " +DifferenceBetweenStaticAndNonStatic.count);
        System.out.println("static count position is " +p.getCount1());
        System.out.println("static count position is " +DifferenceBetweenStaticAndNonStatic.countStaticPosition());

        System.out.println("next case: ");
        System.out.println(" ");

    }
}

}

Теперь вывод будет:

static count position is 0
static count position is 1
static count position is 1
next case: 

static count position is 1
static count position is 1
static count position is 2
next case: 

static count position is 2
static count position is 1
static count position is 3
next case:  

Ответ 8

Если ваш метод связан с характеристиками объекта, вы должны определить его как нестатический метод. В противном случае вы можете определить свой метод как статический, и вы можете использовать его независимо от объекта.

Ответ 9

Основное отличие: нестатические члены объявляются без использования ключевого слова static

Все статические члены (как переменные, так и методы) передаются с помощью имени класса. Следовательно, статические члены класса также называются членами класса или членами класса.

Чтобы получить доступ к нестационарным членам класса, мы должны создать ссылочную переменную. ссылочная переменная хранит объект.

Ответ 10

Другой сценарий для статического метода.

Да, статический метод относится к классу, а не к объекту. И если вы не хотите, чтобы кто-либо инициализировал объект класса или вам не нужно больше одного объекта, вам нужно использовать частный конструктор и, следовательно, статический метод.

Здесь у нас есть частный конструктор и с помощью статического метода мы создаем объект.

Ex::

public class Demo {

        private static Demo obj = null;         
        private Demo() {
        }

        public static Demo createObj() {

            if(obj == null) {
               obj = new Demo();
            }
            return obj;
        }
}

Демо obj1 = Demo.createObj();

Здесь может быть только один экземпляр.

Ответ 11

Пример статического метода

class StaticDemo
{

 public static void copyArg(String str1, String str2)
    {
       str2 = str1;
       System.out.println("First String arg is: "+str1);
       System.out.println("Second String arg is: "+str2);
    }
    public static void main(String agrs[])
    {
      //StaticDemo.copyArg("XYZ", "ABC");
      copyArg("XYZ", "ABC");
    }
}

Вывод:

First String arg is: XYZ

Second String arg is: XYZ

Как видно из приведенного выше примера, для вызова статического метода я даже не использовал объект. Он может быть вызван непосредственно в программе или с использованием имени класса.

Пример нестатического метода

class Test
{
    public void display()
    {
       System.out.println("I'm non-static method");
    }
    public static void main(String agrs[])
    {
       Test obj=new Test();
       obj.display();
    }
}

Вывод:

I'm non-static method

Нестатический метод всегда вызывается с помощью объекта класса, как показано в приведенном выше примере.

Ключевые моменты:

Как вызвать статические методы: direct или using имя класса:

StaticDemo.copyArg(s1, s2);

или же

copyArg(s1, s2);

Как вызвать нестатический метод: использование объекта класса:

Test obj = new Test();

Ответ 12

Проще говоря, с точки зрения пользователя статический метод либо не использует никаких переменных вообще, либо все переменные, которые он использует, являются локальными для метода или являются статическими. Определение статического метода дает небольшое преимущество в производительности.

Ответ 13

- First we must know that the diff bet static and non static methods 
is differ from static and non static variables : 

- this code explain static method - non static method and what is the diff 

    public class MyClass {
        static {
            System.out.println("this is static routine ... ");

        }
          public static void foo(){
            System.out.println("this is static method ");
        }

        public void blabla(){

         System.out.println("this is non static method ");
        }

        public static void main(String[] args) {

           /* ***************************************************************************  
            * 1- in static method you can implement the method inside its class like :  *       
            * you don't have to make an object of this class to implement this method   *      
            * MyClass.foo();          // this is correct                                *     
            * MyClass.blabla();       // this is not correct because any non static     *
            * method you must make an object from the class to access it like this :    *            
            * MyClass m = new MyClass();                                                *     
            * m.blabla();                                                               *    
            * ***************************************************************************/

            // access static method without make an object 
            MyClass.foo();

            MyClass m = new MyClass();
            // access non static method via make object 
            m.blabla();
            /* 
              access static method make a warning but the code run ok 
               because you don't have to make an object from MyClass 
               you can easily call it MyClass.foo(); 
            */
            m.foo();
        }    
    }
    /* output of the code */
    /*
    this is static routine ... 
    this is static method 
    this is non static method 
    this is static method
    */

 - this code explain static method - non static Variables and what is the diff 


     public class Myclass2 {

                // you can declare static variable here : 
                // or you can write  int callCount = 0; 
                // make the same thing 
                //static int callCount = 0; = int callCount = 0;
                static int callCount = 0;    

                public void method() {
                    /********************************************************************* 
                    Can i declare a static variable inside static member function in Java?
                    - no you can't 
                    static int callCount = 0;  // error                                                   
                    ***********************************************************************/
                /* static variable */
                callCount++;
                System.out.println("Calls in method (1) : " + callCount);
                }

                public void method2() {
                int callCount2 = 0 ; 
                /* non static variable */   
                callCount2++;
                System.out.println("Calls in method (2) : " + callCount2);
                }


            public static void main(String[] args) {
             Myclass2 m = new Myclass2();
             /* method (1) calls */
             m.method(); 
             m.method();
             m.method();
             /* method (2) calls */
             m.method2();
             m.method2();
             m.method2();
            }

        }
        // output 

        // Calls in method (1) : 1
        // Calls in method (1) : 2
        // Calls in method (1) : 3
        // Calls in method (2) : 1
        // Calls in method (2) : 1
        // Calls in method (2) : 1 

Ответ 14

"Иногда вы хотите иметь переменные, которые являются общими для всех объектов. Это достигается с помощью статического модификатора.

то есть. класс человека - количество голов (1) является статичным, одинаковым для всех людей, однако человеческое - цвет волос является переменным для каждого человека.

Обратите внимание, что статические вары также могут использоваться для обмена информацией во всех экземплярах