2010-10-11 4 views
52

Смотрите ниже фрагменты кода:В чем разница между статическим методом и нестатическим методом?

кодекса 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)); 
    } 
} 

Code 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 в качестве ответа.

ответ

114

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

Пример:

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();

+0

Определяет ли спецификатор доступа (public) доступ к статическому методу? Как то, что произойдет, если ваше имя метода будет static string method1()? –

+0

Можно также поставить статический метод в UtililyClass? – karlihnos

7

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

Ссылка: Static Vs Non-Static methods

1

Основное отличие не является статические члены объявляются с вне с помощью ключевого слова «статический»

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

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

+0

Для получения дополнительной информации вы можете прочитать следующие ссылки: http://stackoverflow.com/questions/1184701/static-vs-non-static-method http://stackoverflow.com/questions/1353309/java-static- vs-non-static-inner-class http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class http://stackoverflow.com/questions/5241899/what- это-разностная-между-статических-методы-в-нестатический класс-и-м-статический – Aamer

3

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

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: 
22

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

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

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

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

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

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

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

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

5

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

Традиционный «статический» метод, как и в большинстве языков, не относящихся к 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 ПОСЛЕ написания кода. Острота -

8

Вообще

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

ClassName.methodname() 

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

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

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

1

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

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

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

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();

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

-1

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

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

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

1

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

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"); 
} 
} 

Выход:

Первая строка Arg является: XYZ

Второй аргумент строки: XYZ

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

Non-статический метод Пример

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(); 
} 
} 

Выход:

Я не-статический метод

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

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

Как вызывать статические методы: прямой или используя имя класса:

StaticDemo.copyArg (s1, s2); ИЛИ copyArg (s1, s2);

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

Тест OBJ = новое испытание();

1

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

Смежные вопросы