2016-10-14 6 views
-8

Я новичок в java, мне было интересно, почему мне нужно создать новый экземпляр класса для использования его non-static methods в main method, но не в других методов, таких как следующийновый экземпляр класса в Java основной метод

public class Test { 


public void test(){ 
    System.out.println("test"); 
} 
public static void main(String args[]){ 

    test(); // error Cannot make a static reference to the non-static method test() from the type Test 
} 
public void tst(){ 
    test(); // no errors 
} 

} 
+0

потому что 'tst' также нестатический метод – njzk2

+2

Статические методы привязываются к классу, а не к объектам.Нестатический метод привязывается к определенному объекту (или экземпляру) этого класса, поэтому для вызова нестатического метода требуется объект этого класса. Я рекомендую прочитать учебное пособие, например. [Учебник Oracle по объектно-ориентированным концепциям] (https://docs.oracle.com/javase/tutorial/java/concepts/). – Turing85

ответ

0

В java класс имеет поля и методы (или функции). К каждому слову можно добавить ключевое слово «статический».

Объекты, отмеченные ключевым словом «статические», относятся к классу, а другие объекты связаны друг с другом. Для доступа к статическим полям или методам класса требуется только класс и его экземпляр (созданный с использованием нового ключевого слова), который не требуется создавать.

Методы и поля, которые не помечены как статические, относятся к активному экземпляру класса.

Теперь предположим, что существует класс Test.java, и у нас нет экземпляра его. Мы можем назвать любой из его методов, который помечен как статический. Попробуйте подумать над ответом: «Изнутри статического метода (без экземпляра класса), как мы можем вызвать метод или как мы можем получить доступ к полю, принадлежащему некоторому экземпляру?»

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

Как уже упоминалось Xavi в своем ответе вы также можете обратиться к https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html для понимания «статического».

Все нестатические методы и поля имеют связанный с ними «этот» (https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html), который ссылается на текущий активный экземпляр класса.

Следовательно, «главного» метод является статическим, не может назвать любой нерастворимый статический метод без экземпляра класса «Test»

2

Look, main является static способ. Вы вызываете его из класса, который еще не был инициализирован. Вы можете это сделать, однако вы не можете позвонить Test#test без экземпляра Test.

Рабочий код:

public class Test { 
    public void test(){ 
     System.out.println("test"); 
    } 
    public static void main(String args[]){ 
     Test test = new Test(); 
     test.test(); 
    } 
    public void tst(){ 
     test(); // no errors 
    } 
} 

Объяснение:

Non-статические методы должны вызываться на объектах. Объекты создаются с ключевым словом new. Иногда есть методы, которые возвращают новые объекты, но они вызывают new внутри.

Статические методы можно назвать без создания объекта. Затем вам необходимо объявить их static. Как? Просто добавьте static перед типом возврата.

Пример того, как работают статические методы:

public class Test { 
    public void test(){ 
     System.out.println("test"); 
    } 
    public static void main(String args[]){ 
     tst(); 
     Test test = new Test(); 
     test.test(); 
    } 
    public static void tst(){ 
     Test test = new Test(); 
     test.test(); 
    } 
} 

Там не было никаких ошибок в tst(), потому что вы назвали метод, который вы видели в этой области. Это означает, что если был создан объект класса Test, вы могли бы позвонить tst и test. Если вы попытались позвонить tst перед моим рефактором, вам было бы предупреждено о том же предупреждении.

0

Это урок 1: создать объект из вашего класса:

Test test = new Test(); 
test.test(); // will print test 
+0

Некоторые объяснения были бы хороши. – Turing85

1

По определению

статических методов, относятся к классу, то есть вы можете использовать их по телефону

ClassName.methodName(); 

Методы экземпляров (нестатические) должны вызываться экземплярами объекта определенного класса.

как

Test test = new Test(); 
     test.test(); 
0

public static void main является метод статический, что означает, что не выполняется в контексте конкретного экземпляра класса.

Любой метод, не квалифицированный с помощью static, должен быть вызван в контексте конкретного экземпляра класса, поэтому необходимо экземпляр объекта или удалить экземпляр класса для вызова, если из статического контекста, или вызовите его из нестатического контекста, такого как ваш метод public void tst().

Я настоятельно рекомендую ознакомиться с некоторыми базовыми учебниками по Java, такими как Understanding Class Members.

1

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

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

Почему? Обычно в java есть 3 типа переменных, основанных на нашей позиции объявления 1) локальная переменная 2) переменная экземпляра и 3) статическая переменная, такая же, как метод экземпляра и статический метод.

УКАЗАНИЕ Статический метод или блок выполняются во время загрузки класса и в то время, когда вы пытаетесь вызвать обычный метод, а область действия обычного метода аналогична области действия объекта, поэтому без создания объекта u может ' Я также думаю об обычном/примерном методе.

1

Think статических методов, как существующие вне любого экземпляра этого класса. Это действительно бесконтактный метод. Чтобы вызвать нестатические методы, вы должны ссылаться на экземпляр, чтобы вызвать его.

Еще один способ взглянуть на проблему - с точки зрения переменных. Статические переменные совместно используются всеми экземплярами класса и не относятся к одному экземпляру.

public class Test { 

    private static int var1 = 0; 
    private int var2 = 0; 

    public static void main(String[] args) { 
     Test test1 = new Test(); 
     Test test2 = new Test(); 
     var1++; 
     test1.testMethod(); 
     test2.testMethod(); 
     System.out.println("var1=" + var1); 
     System.out.println("test1.var2=" + test1.var2); 
     System.out.println("test2.var2=" + test2.var2); 
    } 

    private void testMethod() { 
     var1++; 
     var2++; 
    } 
} 

будет производить следующие

var1=3 
test1.var2=1 
test2.var2=1 

Статические методы также разделяются всеми экземплярами класса, поэтому не имеют прямого доступа к не-статические переменные.

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