2015-09-13 3 views
0
public class TestThread 
{ 
    public static void main (String [] args) 
    { 
     Foo f = new Foo(); 
     Thread t = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       f.doStuff(); 
      } 
     }); 
     Thread g = new Thread() 
     { 
      public void run() 
      { 
       f.doStuff(); 
      } 
     }; 
     t.start(); 
     g.start(); 
    } 
} 
class Foo 
{ 
    public void doStuff() 
    {} 
} 

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

+0

В чем Ваш вопрос здесь>? f является объектом типа Foo ..., это имело бы большее значение, если бы вы, например, объявили строку In во внешнем классе и спросили, почему ее доступно в классе Foo ... – QuakeCore

+0

@abhishekbafna: o такой странный комментарий от пользователя с вашей репутацией ..., thats java 101! – QuakeCore

+0

@abhishekbafna серьезно сейчас?, [Это не так] (http://stackoverflow.com/questions/10442758/why-must-a-java-file-have-the-same-name-as-its-the-sublic-name-as-its-the-public- класс) – QuakeCore

ответ

0
public class TestThread 
{ 
    boolean innerClassCanSeeMe =true; 
    public static void main (String [] args) 
    { 
     boolean accessible=false; 
     final Foo f = new Foo(); 
     Thread t = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       f.doStuff(); 
      } 
     }); 
     Thread g = new Thread() 
     { 
      public void run() 
      { 
       f.doStuff(); 
      } 
     }; 
     t.start(); 
     g.start(); 
    } 
} 
class Foo 
{ 
    public void doStuff() 
    { 
     System.out.println( TestThread.innerClassCanSeeMe);//yay error, unless you make innerClassCanSeeMe static. 
     System.out.println(new TestThread().innerClassCanSeeMe); 
    } 
} 

Я настоятельно рекомендую вам работать на вашей ООП, вы можете start from here, и это не будет прямым ответ на ваш вопрос, но если вы проводите пару часов в этом учебном пособии, я думаю, что вы сможете ответить самим себе, и плохо даже дать вам право голоса, если вы ответите себе в течение 24 часов :)

0

f действительно окончательный; в соответствии с документацией Oracle по локальным классам:

However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.