About Question com.enthuware.ets.scjp.v6.2.576 :
Posted: Mon Mar 18, 2013 8:42 am
I dont understand the explanation for answer 2.
Why is answer 2 correct ?
Could somebody please give me a clear explanation ?
-------------------------------------------------------------------------------
Given the declaration
interface Worker { void perform_work(); }
which of the following methods/class are valid?
1.
Worker getWorker(int i)
{
return new Worker(){ public void perform_work() { System.out.println(i); } };
}
2.
Worker getWorker(final int i)
{
return new Worker() { public void perform_work() { System.out.println(i); } };
}
3.
Worker getWorker(int i)
{
int x = i;
class MyWorker implements Worker { public void perform_work() { System.out.println(x); } };
return new MyWorker();
}
4.
Worker getWorker(final int i)
{
class MyWorker implements Worker { public void perform_work() { System.out.println(i); } };
return new MyWorker();
}
5.
class TestClass
{
Worker getWorker(int i)
{
return new MyWorker( i);
}
public static class MyWorker implements Worker
{
int x;
MyWorker(int i) { x = i; }
public void perform_work( ) { System.out.println(x); }
}
}`
answer 1 is not correct
explanation: As method parameter i is not final it cannot be accessed from perform_work().
answer 2 is correct
explanation : As method paramter 'i' is final, it can be accessed from perform_work();
answer 3 is not correct
explanation : x is also not accessible from perform_work(). In fact, i and x are similar for all practical purposes.
answer 4 is correct
explanation : no errors
answer 5 is correct
explanation : MyWorker is a nested class (although static). So it can be instantiated like any other package level class eg. new OuterClass.MyWorker(10);
Why is answer 2 correct ?
Could somebody please give me a clear explanation ?
-------------------------------------------------------------------------------
Given the declaration
interface Worker { void perform_work(); }
which of the following methods/class are valid?
1.
Worker getWorker(int i)
{
return new Worker(){ public void perform_work() { System.out.println(i); } };
}
2.
Worker getWorker(final int i)
{
return new Worker() { public void perform_work() { System.out.println(i); } };
}
3.
Worker getWorker(int i)
{
int x = i;
class MyWorker implements Worker { public void perform_work() { System.out.println(x); } };
return new MyWorker();
}
4.
Worker getWorker(final int i)
{
class MyWorker implements Worker { public void perform_work() { System.out.println(i); } };
return new MyWorker();
}
5.
class TestClass
{
Worker getWorker(int i)
{
return new MyWorker( i);
}
public static class MyWorker implements Worker
{
int x;
MyWorker(int i) { x = i; }
public void perform_work( ) { System.out.println(x); }
}
}`
answer 1 is not correct
explanation: As method parameter i is not final it cannot be accessed from perform_work().
answer 2 is correct
explanation : As method paramter 'i' is final, it can be accessed from perform_work();
answer 3 is not correct
explanation : x is also not accessible from perform_work(). In fact, i and x are similar for all practical purposes.
answer 4 is correct
explanation : no errors
answer 5 is correct
explanation : MyWorker is a nested class (although static). So it can be instantiated like any other package level class eg. new OuterClass.MyWorker(10);