Declaration & Access Control
Question 1
package com.dan.chisholm;
public class A {
   public void m1() {System.out.print("A.m1, ");}
   protected void m2() {System.out.print("A.m2, ");}
   private void m3() {System.out.print("A.m3, ");}
   void m4() {System.out.print("A.m4, ");}
}
class B {
   public static void main(String[] args) {
     A a = new A();
     a.m1(); // 1
     a.m2(); // 2
     a.m3(); // 3
     a.m4(); // 4
}}
Assume that the code appears in a single file named A.java. What is the result of
attempting to compile and run the program?
a.   Prints: A.m1, A.m2, A.m3, A.m4,
b.   Compile-time error at 1.
c.   Compile-time error at 2.
d.   Compile-time error at 3.
e.   Compile-time error at 4.
f.   None of the above
     ANSWER
                        Both class A and B are declared in the same package, so class B
           Compile-time
     1 d                has access to the public, protected, and package access
           error at 3.
                        methods of class A.
Question 2
class A {A(int i) {}}         // 1
class B extends A {}          // 2
Which of the following statements are true?
a. The compiler attempts to create a default constructor for class A.
b. The compiler attempts to create a default constructor for class B.
c. Compile-time error at 1.
d. Compile-time error at 2.
     ANSWER
                               If no constructor is declared explicitly, then the compiler
                               will implicitly create a default constructor that accepts no
                               parameters, has no throws clause, and invokes its
         The compiler attempts superclass constructor. Since class A has an explicitly
         to create a default   declared constructor, the compiler will not create an
       b
     2   constructor for class implicit default constructor. Class B does not have an
       d
         B. Compile-time error explicit constructor declaration, so the compiler attempts
         at 2.                 to create a default constructor. Since class A does not
                               have a no-parameter constructor, the attempt by class B to
                               invoke the no parameter constructor of A would fail. As a
                               result, a compiler error is generated at marker 2.
Question 3
Which of the following modifiers can be applied to a constructor?
a.   private
b.   abstract
c.   final
d.   volatile
e.   native
f.   None of the above.
     ANSWER
                 Constructors are not inherited and can not be overridden, so there is
                 no need for the final modifier in a constructor declaration.
                 Furthermore, an abstract constructor would be useless, since it
     3 a private could never be implemented. The volatile modifier can be
                 applied to a field, but not to a constructor. Native constructors are not
                 permitted, because it would be difficult for Java to verify that the
                 native constructor properly invokes the superclass constructor.
Question 4
Which of the following modifiers can be applied to the declaration of a field?
a. abstract
b. final
c. private
d. protected
e. public
     ANSWER
                           A field is a class member. A static field is sometimes called
                           a class variable. A non-static field is sometimes called an
       b   final           instance variable. A variable declaration that is immediately
       c   private         contained by a block such as a method body is called a local
     4                     variable. The access modifiers, private, protected and
       d   protected
       e   public          public, can be applied to a field. A final field can not
                           have its value assigned more than once. The abstract
                           modifier may be applied to methods but not to fields.
Question 5
Which of the following modifiers can not be applied to a method?
a.   abstract
b.   private
c.   protected
d.   public
e.   volatile
f.   None of the above.
     ANSWER
                  An abstract method declaration provides no method body. If
                  one abstract method is appears within a class declaration, then
                  the entire class must be declared abstract and the class can not
     5 e volatile be instantiated. The access modifiers, private, protected and
                  public, can be applied to a method. The field modifiers,
                  transient and volatile, are not applicable to method
                  declarations.
Question 6
class JSC201 {
  static byte m1() {
    final char c1 = '\u0001';
    return c1;                                         // 1
  }
  static byte m2(final char c2) {return c2;}           // 2
  public static void main(String[] args) {
    char c3 = '\u0003';
      System.out.print(""+m1()+m2(c3));                    // 3
}}
What is the result of attempting to compile and run the program?
a.   Prints: 13
b.   Prints: 4
c.   Compile-time error at 1
d.   Compile-time error at 2
e.   Run-time error
f.   None of the above
     ANSWER
                       There is a compile-time error at 2. The char type variable c2 is not
                       a compile-time constant, so it can not be assigned to type byte
                       without an explicit cast. The method parameter c2 is declared final,
                       so the value of c2 can not be changed within method m2. The value
                       of method parameter c2 is set at run time to the value of the
                       argument that is provided when m2 is invoked at line 3. For that
                       reason, the method parameter c2 is not a compile-time constant. In
                       method m2, the statement, "return c2;", is a return statement
                       with an expression, c2. A compile-time error occurs if the type of
                       the expression is not assignable to the declared result type of the
                       method. The declared result type of method m2 is byte. The
                       return statement attempts to return the value of the char type
         Compile-
                       variable c2. If a char value is a compile-time constant, and if the
     6 d time error at
                       value falls within the range of type byte, then the char value is
         2
                       assignable to type byte. In method m2, variable c2 is not a
                       compile-time constant, because the value of c2 is not known at
                       compile time. Instead, the value of c2 is assigned at run time to the
                       value of the argument. Since the char type variable c2 is not a
                       compile-time constant, the value of variable c2 is not assignable to
                       the return type of method m2 without an explicit cast. While the
                       declaration of method m2 produces a compile-time error, the
                       declaration of method m1 does not. The local variable c1 is
                       declared final and the value is set at compile time; so c1 is a
                       compile-time constant. The value \u0001 falls within the range of
                       type byte; so the value of the compile-time constant c1 is
                       assignable to the return type of method m1 without an explicit cast.
Question 7
Which of the following modifiers can be applied to a class that is not a nested class?
a.   public
b.   protected
c.   private
d.   abstract
e.   static
f.   final
     ANSWER
                           The access modifiers, protected and private, can be
                           applied to a class that is a member of an enclosing class, but can
                           not be applied to a local class or a class that is not nested inside
                           another class. The static modifier can be applied to a class
                           that is a member of an enclosing class, but can not be applied to
       a public
                           a local class or a class that is not nested inside another class.
     7 d abstract
                           The public modifier can be applied to a top level class to
       f final
                           allow the class to be accessed from outside of the package. The
                           abstract modifier prevents the class from being instantiated.
                           An abstract class may include zero, one or more
                           abstract methods. The final modifier prevents a class
                           from being extended.
Question 8
Which of the following techniques can be used to prevent the instantiation of a class by
any code outside of the class?
a.   Do not declare any constructors.
b.   Do not use a return statement in the constructor.
c.   Declare all constructors using the keyword void to indicate that nothing is returned.
d.   Declare all constructors using the private access modifier.
e.   None of the above.
     ANSWER
                            If no constructors are declared explicitly; then the compiler
                            will create one implicitly, and it will have the same access
                            modifier as the class. The explicit declaration of any
         Declare all        constructor will prevent the creation of a default constructor.
         constructors using If all constructors are declared private, then code outside
     8 d
         the private        of the class will not have access to the constructors and will
         access modifier.   not have the ability to create an instance of the class.
                            Constructors do not return a value and constructor
                            declarations do not include a return type, so the keyword
                            void is not applicable to a constructor declaration.
Question 9
Which of the following modifiers can be applied to a constructor?
a.   protected
b.   public
c.   static
d.   synchronized
e.   transient
     ANSWER
                         Constructors can not be inherited, so an abstract constructor
                         would be useless, since it could never be implemented. A
                         static constructor would also be useless--or nearly so--since
         a protected     it would be unable to access the non-static members of the new
     9
         b public        instance. An object is not available to multiple threads during
                         the construction process, so the synchronized modifier
                         would not provide additional protection. The transient
                         modifier can be applied to a field, but not a constructor.
Question 10
Which of the following modifiers can be applied to the declaration of a field?
a.   static
b.   synchronized
c.   transient
d.   volatile
e.   native
     ANSWER
                            A transient field is not part of the persistent state of an
                            object. Transient fields are not serialized. Fields that are
        a static            shared between threads may be marked volatile to force
     10 c transient         each thread to reconcile its own working copy of the field
        d volatile          with the master copy stored in the main memory. The
                            synchronized modifier may be applied to methods but
                            not to fields.
Question 11
Which of the following modifiers can not be applied to a method?
a.   final
b.   static
c.   synchronized
d.   transient
e.   native
f.   None of the above.
     ANSWER
                    A final method can not be overridden. A static method is
                    associated with a class, but not a particular instance of the class.
                    A thread can not enter a synchronized method without first
     11 d transient
                    acquiring a lock. The field modifiers, transient and
                    volatile, are not applicable to method declarations. A
                    native method is implemented in platform-dependent code.
Question 12
class JSC202 {
   static byte m1() {final short s1 = 2; return s1;}               // 1
   static byte m2(final short s2) {return s2;}                     // 2
   public static void main(String[] args) {
     short s3 = 4;
     System.out.print(""+m1()+m2(s3));                             // 3
}}
What is the result of attempting to compile and run the program?
a.   Prints: 24
b.   Prints: 6
c.   Compile-time error at 1.
d.   Compile-time error at 2.
e.   Run-time error
f.   None of the above
     ANSWER
     12 d Compile- There is a compile-time error at 2. The short type variable s2 is
          time error at not a compile-time constant, so it can not be assigned to type
          2.            byte without an explicit cast. The method parameter s2 is
                        declared final, so the value of s2 can not be changed within
                        method m2. The value of method parameter s2 is set at run time to
                        the value of the argument that is provided when m2 is invoked at
                        line 3. For that reason, the method parameter s2 is not a compile-
                        time constant. In method m2, the statement, "return s2;", is a
                        return statement with an expression, s2. A compile-time error
                      occurs if the type of the expression is not assignable to the declared
                      result type of the method. The declared result type of method m2 is
                      byte. The return statement attempts to return the value of the
                      short type variable s2. If a short value is a compile-time
                      constant, and if the value falls within the range of type byte, then
                      the short value is assignable to type byte without an explicit
                      cast. In method m2, variable s2 is not a compile-time constant,
                      because the value of s2 is not known at compile time. Instead, the
                      value of s2 is assigned at run time to the value of the argument.
                      Since the short type variable s2 is not a compile-time constant,
                      the value of variable s2 is not assignable to the return type of
                      method m2 without an explicit cast. While the declaration of
                      method m2 produces a compile-time error, the declaration of
                      method m1 does not. The local variable s1 is declared final and
                      the value is set at compile time; so s1 is a compile-time constant.
                      The value 2 falls within the range of type byte; so the value of the
                      compile-time constant s1 is assignable to the return type of
                      method m1 without an explicit cast.
Question 13
// Class A is declared in a file named A.java.
package com.dan.chisholm;
public class A {
   public void m1() {System.out.print("A.m1, ");}
   protected void m2() {System.out.print("A.m2, ");}
   private void m3() {System.out.print("A.m3, ");}
   void m4() {System.out.print("A.m4, ");}
}
// Class D is declared in a file named D.java.
package com.dan.chisholm.other;
import com.dan.chisholm.A;
public class D {
   public static void main(String[] args) {
     A a = new A();
     a.m1(); // 1
     a.m2(); // 2
     a.m3(); // 3
     a.m4(); // 4
}}
What is the result of attempting to compile and run the program?
a.   Prints: A.m1, A.m2, A.m3, A.m4,
b.   Compile-time error at 1.
c.   Compile-time error at 2.
d.   Compile-time error at 3.
e. Compile-time error at 4.
     ANSWER
                                Classes A and D are not declared in the same package,
          Compile-time error at so class D does not have access to package access
        c
          2. Compile-time error
     13 d                       method, m4. Since class D does not extend class A, class
          at 3. Compile-time
        e                       D does not have access to the protected method, m2,
          error at 4.
                                of class A.
Question 14
Which of the follow statements is true.
a.   An anonymous class can be declared abstract.
b.   A local class can be declared abstract.
c.   An abstract class can be instantiated.
d.   An abstract class is implicitly final.
e.   An abstract class must declare at least one abstract method.
f.   An abstract class can not extend a concrete class.
     ANSWER
                            An anonymous class can not be extended; therefore, an
                            anonymous class can not be declared abstract. A local
                            class can be abstract. An abstract class can not be
          A local class can
                            instantiated. If a class declaration contains an abstract
     14 b be declared
                            method, then the class must also be declared abstract. A
          abstract.
                            class can be declared abstract even if it does not contain
                            an abstract method. An abstract class can never be
                            declared final.
Question 15
Which of the following statements are true?
a. The compiler will create a default constructor if no other constructor is declared.
b. The default constructor takes no arguments.
c. If a class A has a direct superclass, then the default constructor of class A invokes the
   no-argument constructor of the superclass.
d. The default constructor declares Exception in the throws clause.
e. The default constructor is always given the private access modifier.
f. The default constructor is always given the public modifier.
g. The default constructor is always given default package access.
     ANSWER
                                              If no constructor is declared explicitly, then
                                              the compiler will implicitly insert a default
                                              constructor. The default constructor takes no
                                              arguments. The primordial class Object
                                              has no superclass; so the default constructor
                                              of type Object does not invoke a superclass
                                              constructor. If a class A has a direct
                                              superclass, then the default constructor of
                                              class A will invoke the no-argument
                                              superclass constructor. It is unlikely that the
          The compiler will create a default real exam would try to trick you with a
          constructor if no other constructor question that requires you to know that the
          is declared. The default            constructor of type Object does not
        a
          constructor takes no arguments. If
     15 b                                     invoke a superclass constructor. For the
          a class A has a direct superclass,
        c                                     purposes of the real exam, it might be safer
          then the default constructor of
                                              to overlook that particular unique feature of
          class A invokes the no-argument
                                              type Object. If a subclass constructor
          constructor of the superclass.
                                              attempts to invoke the no-argument
                                              superclass constructor when none exists,
                                              then a compile-time error is generated. The
                                              access modifier implicitly assigned to the
                                              default constructor is the same as that
                                              assigned to the class. The default constructor
                                              does not have a throws clause.
                                              Consequently, a compile-time error is
                                              generated if the no-argument constructor of
                                              the superclass has a throws clause.
Question 16
Which of the following is used to prevent the serialization of a non-static field?
a.   final
b.   protected
c.   synchronized
d.   transient
e.   volatile
f.   native
     ANSWER
     16 d transient A transient field is not part of the persistent state of an
                    object, so it is not serialized. A static field is also not part of
                          the persistent state of an object, and also is not serialized.
Question 17
Which of the following modifiers can not be used with the abstract modifier in a method
declaration?
a.   final
b.   private
c.   protected
d.   public
e.   static
f.   synchronized
g.   native
     ANSWER
                                     A final or private method can not be overridden,
                                     and can not be abstract. An abstract method
                                     declaration provides no implementation of the method,
        a   final private            and all implementation details are left to the overriding
        b
            static                   method in the subclass. The synchronized
     17 e
            synchronized             modifier specifies an implementation detail that can be
        f
            native                   omitted from the declaration of an overriding method
        g
                                     of a subclass, so it makes no sense to allow the use of
                                     the synchronized modifier in an abstract
                                     method declaration.
Question 18
class JSC203 {
   static int m1(byte b) {return b;}   // 1
   static int m2(char c) {return c;}   // 2
   static int m3(long l) {return l;}   // 3
   public static void main(String[] args) {
     byte b = 1; char c = '\u0002'; long l = 4L;
     System.out.print(""+m1(b)+m2(c)+m3(l));
}}
What is the result of attempting to compile and run the program?
a.   Prints: 124
b.   Prints: 7
c.   Compile-time error at 1.
d.   Compile-time error at 2.
e. Compile-time error at 3.
f. Run-time error
     ANSWER
                        There is a compile-time error at line 3. The long type variable, l,
                        can not be assigned to type int without an explicit cast. The
                        statement, "return l;", is a return statement with an
                        expression, l. A compile-time error occurs if the type of the
                        expression is not assignable to the declared result type of the
          Compile- method. The declared result type of the method, m3, is int. The
     18 e time error at type of the variable, l, is long, so an explicit cast is needed to
          3.            perform the narrowing primitive conversion, "return
                        (int)l;". The declarations of methods m1 and m2 do not
                        generate compile-time errors, because the types of the expressions
                        contained in the return statements are assignable to type int.
                        Widening conversions from types byte, char, or short to type
                        int do not require an explicit cast.
Question 19
// Class A is declared in a file named A.java.
package com.dan.chisholm;
public class A {
    public void m1() {System.out.print("A.m1, ");}
    protected void m2() {System.out.print("A.m2, ");}
    private void m3() {System.out.print("A.m3, ");}
    void m4() {System.out.print("A.m4, ");}
}
// Class C is declared in a file named C.java.
package com.dan.chisholm.other;
import com.dan.chisholm.A;
public class C extends A {
   public static void main(String[] args) {
     C c = new C();
     c.m1(); // 1
     c.m2(); // 2
     c.m3(); // 3
     c.m4(); // 4
}}
What is the result of attempting to compile and run the program?
a.   Prints: A.m1, A.m2, A.m3, A.m4,
b.   Compile-time error at 1.
c.   Compile-time error at 2.
d.   Compile-time error at 3.
e.   Compile-time error at 4.
     ANSWER
          Compile-time         Class A and C are not declared in the same package;
        d error at 3.          therefore, class C does not have access to package access
     19
        e Compile-time         method, m4. Since class C extends class A, class C does
          error at 4.          have access to the protected method, m2, of class A.
Question 20
public class A {int i1; void m1() {}}
Which of the following statements are true?
a.   class A extends Object.
b.   Field i1 is implicitly public, because class A is public.
c.   Method m1 is implicitly public, because class A is public.
d.   The compiler will insert a default constructor implicitly.
e.   The default constructor has no throws clause.
f.   The default constructor of class A has package access.
g.   The default constructor accepts one parameter for each field in class A.
h.   The default constructor invokes the no-parameter constructor of the superclass.
     ANSWER
                                             Field i1 and m1 both have package access.
            class A extends Object. The
                                             When no constructor is declared explicitly the
            compiler will insert a default
                                             compiler will insert one implicitly. The
        a   constructor implicitly. The
                                             implicitly declared default constructor will
        d   default constructor has no
     20                                      have the same access privileges as the class.
        e   throws clause. The default
                                             In this case, the class is public, so the
        h   constructor invokes the no-
                                             default constructor is also public. The
            parameter constructor of the
                                             default constructor accepts no parameters and
            superclass.
                                             throws no exceptions.