2016-07-14 3 views
-5

Статические методы максимально приближены к глобальному методу. так почему же этот метод вызова вызова невозможен? есть ли другой способ вызова статического метода без создания экземпляра класса?Можно ли вызвать статический метод другого класса из нестатического метода без экземпляра в java?

import java.io.*; 
import java.util.*; 
class pgm 
{ 
    int x,v; 
    static void func() 
    { 
     System.out.println("Function run"); 
    } 
} 
class egs 
{ 
    public static void main(String args[]) 
    { 
     pgm p=null; 
     pgm.func(); 
     try 
     { 
      p.x=10; 
      p.func(); 
     } 
     catch(NullPointerException e) 
     { 
      e.printStackTrace(); 
     } 

    } 
} 
+1

'func' не является статическим методом. Вы пытаетесь вызвать нестатический метод без вызова экземпляра. – user2357112

+1

'egs.func()' не существует ... Я не уверен, почему вы ожидаете, что это сработает. Статические методы не являются глобальными, они все еще связаны с классом. В любом случае у вас даже нет статического метода (кроме основного) –

+0

Возможный дубликат: http: // stackoverflow.com/questions/290884/what-is-the-reason-behind-non-static-method-not-be-referenced-from-a-static –

ответ

-1

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

+0

Я не знаю, что вы даете людям, потому что у этого вопроса есть несколько ответов на SO и на google. –

+0

@MehradMalik - вопрос не является дубликатом того, о чем я предполагаю, что вы имеете в виду. Код в вопросе фактически компилируется –

0

Я думаю, вы в замешательстве.

pgm.func(); 

Правильный способ вызова статического метода. В то время как ...

p.func(); 

даже если p равна нулю (так как это в вашем коде) все равно будет выполнена, поскольку компилятор действительно использует первый путь, поскольку он знает, что этот метод является статическим.

Sidenote: вы перехватываете исключение NullPointerException в p.x, поэтому func() не рассматривается в этом примере.

Так, чтобы ответить,

Можно ли вызвать статический метод другого класса из не статического метода без экземпляра?

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

+0

Причина, по которой он получает исключение NullPointerException, - 'p.x = 10;' - он никогда не попадает в 'p.func();' из блока try из-за этого. –

+0

@ErwinBolwidt - Я хорошо знаю, и это не важно. Я сказал, что будет выполнен, если не пойман –

+0

Конечно, это часть дела. Когда OP запускает свой код, он получает исключение NullPointerException. 'p.func();' не будет выполняться в отличие от вас, потому что 'p.x = 10;' вызвало исключение NullPointerException. Я согласен с тем, что OP не должен ставить это утверждение в свой код, потому что он не связан с его проблемой, но, скорее всего, это один из источников путаницы OP. –

1

во-первых, модификатор статическими не допускается в классе платиноидов.

Если вы хотите вызвать func и x в ногах класса.

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

После этого вам необходимо получить справочник по классу pgm.

Так что ваш код будет

import java.io.*; 
    import java.util.*; 
    public final class pgm 
    { 
    static int x,v; 
    static void func() 
    { 
     System.out.println("Function run"); 
    } 
    } 

    class egs 
    { 
    public static void main(String args[]) 
    { 
    pgm p=null;   //ref here 
     p.func();   // use ppm func here 
     try 
     { 
     p.x=10; 
     p.func(); 
     } 
     catch(NullPointerException e) 
    { 
     System.out.println("Null caught"); 
    } 

    } 
} 

Вы получите то, что вы хотите.

Никогда не путайте статическую информацию, используемую для компиляции всего блока, метода, переменной во время компиляции, чтобы вы могли вызывать все, что статично во время выполнения без какой-либо инстанцирования (с использованием нового).

Правильный путь Я предоставляю вам выше.

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