2013-03-18 3 views
3

Я новичок в Java и делаю базовое кодирование с нескольких дней. Сегодня, имея дело с переменными и внутренним классом, я застрял во время использования переменной non-final во внутреннем классе.Использование переменной non-final во внутреннем классе

Я использую рамки TestNG для моей работы, так вот сценарий, который я пытаюсь,

=========

public class Dummy extends TestNG { 
    @Override 
    public void setUp() throws Exception { 
     log.error("Setup Goes here"); 
    } 

    @Override 
    public void test() throws Exception { 
     String someString = null; 
     try { 
     someString = "This is some string"; 
     } catch (Exception e) { 
     log.error(e.getMessage()); 
     } 
     Thread executeCommand = new Thread(new Runnable() { 
      @Override 
      public void run() {  
       try { 
        runComeCommand(someString, false); <=====ERROR LINE 
       } catch (Exception e) { 
        log.error(e.getMessage()); 
       } 
      } 
     }); 
    } 

    @Override 
    public void cleanUp() throws Exception { 
    } 
} 

======= ===

Когда я написал вышеприведенный код, он вынул сообщение об ошибке «не может ссылаться на не конечную переменную во внутреннем классе». Поэтому я применил одно из предложений, предоставляемых eclips. Я объявляю переменную someString в родительском классе. Теперь код выглядит так,

==========

public class Dummy extends TestNG { 
    String someString = null; <=====Moved this variable from test() to here 
    @Override 
    public void setUp() throws Exception { 
     log.error("Setup Goes here"); 
    } 
    @Override 
    public void test() throws Exception { 
       <same code goes here> 
    } 

    @Override 
    public void cleanUp() throws Exception { 
    } 
} 

==========

Теперь он не показывает каких-либо ошибок в Eclips. Я хочу знать, почему он теперь принимает переменную во внутреннем классе, хотя и не является окончательным. Разве это не ошибка с той же ошибкой? Будет ли это работать сейчас? Любая помощь будет отличной.

+1

возможно дубликат [внутренний класс неконечной переменной Java] (http://stackoverflow.com/questions/11316954/inner-class-non -final-variable-java) –

ответ

2

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

Во втором примере someString является не локальной переменной, а экземпляром. Внутренний класс может ссылаться на эту переменную из объекта-контейнера.

+0

Поля являются переменными. –

+0

@ AndyThomas-Cramer хорошая точка, исправлена. – Javier

+0

Большое спасибо за очищение моих сомнений. –

2

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

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

0

Компилятор Java не позволит вам ссылаться на переходные переменные, которые не являются окончательными во внутренних классах, как вы видели. Вы можете обратиться к переменной класса, которую Eclipse предложила создать. Это по дизайну на Java. Вы на самом деле ссылаетесь на эту переменную класса в своем внутреннем классе, а не на ваши переходные переменные.

Вы можете прочитать на конечных переменных и внутренних классах here

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