Sei sulla pagina 1di 6

Anonymous Classes

Question 1
Which of the following is a true statement?

a. An anonymous class can extend only the Object class.


b. An anonymous class can not implement an interface.
c. An anonymous class declaration can not have an implements clause.
d. An anonymous class declaration can name more than one interface in the implements
clause.
e. The class instance creation expression for an anonymous class must never include
arguments.
f. None of the above

ANSWER
A class instance creation expression can create an instance
of a named class or an anonymous class. For example, the
class instance creation expression new Object()
creates an instance of the class named Object. If a class
body appears in the class instance creation expression,
then an anonymous class is created. For example, the
expression new Object() {void doNothing()
An anonymous class {}} creates an instance of an anonymous class that
declaration can not
extends Object and implements a method named
1 c have an
implements doNothing. In other words, if a class name immediately
clause. follows the keyword new, then the anonymous class
extends the named class. When a named class is being
extended, then the class instance creation expression can
contain an optional argument list. The arguments will be
passed to the direct superclass constructor that has a
matching parameter list. An anonymous class declaration
can not have an implements clause or an extends
clause.

Question 2
Which of the following are true statements?

a. An anonymous class is implicitly abstract.


b. An anonymous class is implicitly final.
c. An anonymous class is implicitly static.
d. A static reference variable can reference an instance of an anonymous class.
e. An anonymous class declaration must have at least one explicit constructor
declaration.
f. An anonymous class declaration can have more than one explicit constructor
declaration.

ANSWER
An anonymous class can extend Object and
implement an interface, or the anonymous class can
extend a named class including Object. An
anonymous class can not be extended; so it can not be
An anonymous class is abstract. An anonymous class declaration always
implicitly final. A creates an instance of a class; so it is not surprising
that an anonymous class can not be declared
b static reference
2 static. Even so, a static reference variable can
d variable can reference an
refer to an anonymous class. A constructor shares the
instance of an anonymous
same name as the class in which it is declared, but an
class.
anonymous class has no name. For that reason, it is
not surprising that an anonymous class declaration
can not contain an explicit constructor declaration.
Instead, an anonymous class can contain an instance
initializer.

Question 3
abstract class A {
private int x = 4, y = 2;
public int x() {return x;}
public void x(int x) {this.x = x;}
public int y() {return y;}
public void y(int y) {this.y = y;}
public abstract int math();
}
class B {
static A a1 = new A(2,1) {
public A(int i1, int i2) {x(i1);y(i2);};
public int math() {return x()+y();}
};
public static void main(String[] args) {
System.out.print(a1.math());
}}

What is the result of attempting to compile and run the program?

a. Prints: 8
b. Prints: 3122
c. Compile-time error
d. Run-time error
e. None of the above

ANSWER
Compile-time An anonymous class declaration can not contain an explicit
3 c
error declaration of a constructor.

Question 4

class A {
private static int f1 = 1;
private int f2 = 2;
void m1(int p1, final int p2) {
int l1 = 5;
final int l2 = 6;
Object x = new Object() {
int a = f1; // 1
int b = f2; // 2
int c = p1; // 3
int d = p2; // 4
int e = l1; // 5
int f = l2; // 6
};}}

Compile-time errors are generated at which lines?

a. 1
b. 2
c. 3
d. 4
e. 5
f. 6

ANSWER
Local method variables and method parameters are stored on the stack and go
out of scope after the method is exited. Although a local reference variable is
stored on the stack, the referenced object is stored on the heap; so the object
c 3
4 can continue to exist long after the method runs to completion. An object that
e 5
is instantiated within a method or block is not permitted to refer to a variable
that is declared within the method or block unless the variable is declared
final and the variable declaration precedes the creation of the object.

Question 5
abstract class A {
private int x = 1, y = 1;
public A(int x, int y) {this.x = x; this.y = y;}
public abstract int math();
}
class B {
static A a1 = new A(2,1) {public int math() {return x + y;}};
static A a2 = new A(2,1) {public int math() {return x - y;}};
static A a3 = new A(2,1) {public int math() {return x * y;}};
static A a4 = new A(2,1) {public int math() {return x / y;}};
public static void main(String[] args) {
System.out.print("" + a1.math() + a2.math() +
a3.math() + a4.math());
}}

What is the result of attempting to compile and run the program?

a. Prints: 3122
b. Prints: 2011
c. Compile-time error
d. Run-time error
e. None of the above

ANSWER
The instance variables x and y in class A are private, so they are
Compile- not accessible to the anonymous subclasses. If you want to access
5 c
time error the private variables of a superclass, then you will need to add
accessor methods to the superclass such as getX and getY.

Question 6

abstract class A {
private int x = 4, y = 2;
public int x() {return x;}
public void x(int x) {this.x = x;}
public int y() {return y;}
public void y(int y) {this.y = y;}
public abstract int math();
}
class B {
static A a1 = new A() {public int math() {return x()+y();}}
static A a2 = new A() {public int math() {return x()-y();}}
static A a3 = new A() {public int math() {return x()*y();}}
static A a4 = new A() {public int math() {return x()/y();}}
public static void main(String[] args) {
System.out.print("" + a1.math() + a2.math() +
a3.math() + a4.math());
}}

What is the result of attempting to compile and run the program?


a. Prints: 18
b. Prints: 6282
c. Compile-time error
d. Run-time error
e. None of the above

ANSWER
When an anonymous class declaration is the last thing that appears
Compile- in a statement, then a semicolon must follow the declaration.
6 c
time error Anonymous class declarations provide an excellent opportunity for
trick questions involving statements with missing semicolons.

Question 7

class A {String m1() {return "A.m1";}}


interface B {String m2();}
class C {
static class D extends A implements B {
public String m1() {return "D.m1";}
public String m2() {return "D.m2";}
}
static A a1 = new A() implements B {
public String m1() {return "m1";}
public String m2() {return "m2";}
};
public static void main(String[] args) {
System.out.print(a1.m1() + "," + new C.D().m2());
}}

What is the result of attempting to compile and run the program?

a. Prints: m1,D.m2
b. Prints: A.m1,D.m2
c. Compile-time error
d. Run-time error
e. None of the above

ANSWER
An anonymous class can extend Object and implement an
interface, or the anonymous class can extend a named class including
Compile- Object. An anonymous class declaration can not have an
7 c
time error implements clause. In this case, the declaration of the anonymous
class referenced by a1 generates a compile-time error as a result of
the attempt to extend class A and implement interface B.
Question 8

abstract class A {
private int x = 4, y = 2;
public A(int i1, int i2) {x=i1;y=i2;}
public int x() {return x;}
public void x(int x) {this.x = x;}
public int y() {return y;}
public void y(int y) {this.y = y;}
public abstract int math();
}
class B {
static A a1 = new A(2,1) {public int math() {return x()+y();}};
static A a2 = new A(2,1) {public int math() {return x()-y();}};
static A a3 = new A(2,1) {public int math() {return x()*y();}};
static A a4 = new A(2,1) {public int math() {return x()/y();}};
public static void main(String[] args) {
System.out.print("" + a1.math() + a2.math() +
a3.math() + a4.math());
}}

What is the result of attempting to compile and run the program?

a. Prints: 8
b. Prints: 3122
c. Compile-time error
d. Run-time error
e. None of the above

ANSWER
Prints: The arguments that appear in the class instance creation expression of
8 b
3122 an anonymous class are passed to a constructor of the superclass.

Potrebbero piacerti anche